2010-10-15 93 views
0

我目前使用下面的表達式,在將它存儲在MySQL數據庫中之前,將它用於在textarea輸入周圍放置段落標記。Textarea輸入 - 如何處理段落和標題?

$inputText = str_replace('<p></p>', '', '<p>' . preg_replace('#([\r\n]\s*?[\r\n]){2,}#', '</p>$0<p>', $inputText) . '</p>'); 

這個效果很好,除了當我希望使用標題標籤。然後這些不想要的段落標記包圍:

<p><h3>Test Header</h3></p> 

雖然這顯示爲預期的,它不是從一個驗證點大。

任何人都可以提出一個改進的表達式和/或方法來捕獲標題標籤,並只將段落標籤應用於實際段落?或者,我可以在我目前使用的表達式之前將其應用到我的輸入中以產生相同的期望效果。作爲一個便箋,我希望能夠輸入獨立的超鏈接'a'標籤,並仍然像以前一樣用段落標籤包圍它們。

我曾考慮過,在將數據輸入到數據庫中以刪除不需要的段落標記後,手動編輯細節可能會更加容易。

回答

1

我使用這個函數,WordPress的,包裹普的段落周圍很好地以及換行符,同時保留HTML:

function wpautop($pee, $br = 1) { 
    $pee = $pee . "\n"; // just to make things a little easier, pad the end 
    $pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee); 
    // Space things out a little 
    $allblocks = '(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr)'; 
    $pee = preg_replace('!(<' . $allblocks . '[^>]*>)!', "\n$1", $pee); 
    $pee = preg_replace('!(</' . $allblocks . '>)!', "$1\n\n", $pee); 
    $pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines 
    $pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates 
    $pee = preg_replace('/\n?(.+?)(?:\n\s*\n|\z)/s', "<p>$1</p>\n", $pee); // make paragraphs, including one at the end 
    $pee = preg_replace('|<p>\s*?</p>|', '', $pee); // under certain strange conditions it could create a P of entirely whitespace 
    $pee = preg_replace('!<p>([^<]+)\s*?(</(?:div|address|form)[^>]*>)!', "<p>$1</p>$2", $pee); 
    $pee = preg_replace('|<p>|', "$1<p>", $pee); 
    $pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee); // don't pee all over a tag 
    $pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problem with nested lists 
    $pee = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $pee); 
    $pee = str_replace('</blockquote></p>', '</p></blockquote>', $pee); 
    $pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)!', "$1", $pee); 
    $pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee); 
    if ($br) { 
     $pee = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $pee); // optionally make line breaks 
    } 
    $pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*<br />!', "$1", $pee); 
    $pee = preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!', '$1', $pee); 
    $pee = preg_replace("|\n</p>$|", '</p>', $pee); 
    return $pee; 
} 
+0

我不確定這個功能是如何工作的,但它確實做我想要的。知道你是否已經從WordPress版本改變了這一點會很有趣? – Darren 2010-10-15 15:26:59

+0

nope它是從一個稍微舊的版本,但最新版本的功能幾乎相同,做同樣的工作 – fire 2010-10-15 15:52:37

0

可以使用strip_tags的功能是這樣的:

<?php 
$text = '<p><h3>Test Header</h3></p>'; 
echo strip_tags($text); 
echo "\n"; 

// Allow <p> and <h3> 
echo strip_tags($text, '<p><h3>'); 
?> 

它應該工作了。

+0

這種方法肯定是有用的,但不是從WordPress的被盜功能全面。謝謝! – Darren 2010-10-15 15:29:36