2012-06-22 48 views
0

我正在使用正則表達式將HTML轉換爲BBCODE。但是,來自農民所見即所得編輯器(TinyMce)的代碼出現問題。這是一個非常奇怪的案例:PHP - 正則表達式停止在「 」

有一些典型的空白段落,<p>&nbsp;</p>,但我無法以任何方式匹配它們。該folllowing正則表達式的沒有一個是工作:

str_replace("<p>&nbsp;</p>",........) 
str_replace("<p> </p>".........) 
preg_replace("#<p>.?</p>#"....) 

這並不工作,但如果在「空間」在其他地方,我怎麼可能與它們匹配?

preg_replace("#<p>.{1,6}</p>#"....) 

我怎樣才能得到它匹配所有的&nbsp;即使他們不寫(在BD,其中原始字符串存儲,則&nbsp;不寫,也有剛剛<p> </p>塊)這是很奇怪......

回答

3

我建議你閱讀Unicode Regular ExpressionsWikipedia: Unicode Whitespace character

腳本:

$string = '123<p> &nbsp; &nbsp; </p>abc'; 
$pattern = '/<p>(&nbsp;|[\s\p{Z}\p{C}\x85\xA0\x{0085}\x{00A0}\x{FFFD}]+)*<\/p>/iu'; 
$replacement = ''; 
echo preg_replace($pattern, $replacement, $string); 

輸出:

123abc 

注:爲了配合\P{M}\p{M}*+

+0

堆棧溢出不是交互式調試會話。 – casperOne

0

我遇到類似的問題,任何單一的Unicode字形使用模式(PHP程序停止)使用正則表達式時:

([\r\n\t ]|\xC2\xA0|&nbsp;)+

匹配空間(我的目的:更換任何形式的空間單' ')。我測試過的字符串包含豐富的HTML標籤。

這是我的解決方案:

$text = str_replace(array('\xC2\xA0', '&nbsp;'), ' ', $text); $text = preg_replace("/[\n\r\t ]+/", ' ', $text);

希望它可以幫助別人。