2012-10-03 41 views
2

我有一個字符串...更換一個<br /> 2正則表達式

$str = 'bob<br /><br />looked so good<br />tonight!'; 

我想替換任何實例,其中只有一個<br />有兩個。

目前,我有...

echo preg_replace('/(<br \/>\s*){1}/', '<br /><br />', $str); 

但這放兩大<br />鮑勃時,它不僅要經過好走了。

任何幫助將是偉大的!

編輯:輸出應該是...

bob<br /><br />looked so good<br /><br />tonight! 
+0

使用該函數的第五個參數 - 計數,含有該匹配...比較,如果計數大於1,並... – bodi0

+2

所以'


'保持完好? – Blender

+2

不要使用正則表達式來操作HTML,因爲HTML不是**常規語言。你最終會後悔的。使用HTML庫。 – m0skit0

回答

4

基本上你想要一個<br />標籤不是由前面還有一個也緊隨其後。因此:

/(?<!<br \/>)<br \/>(?!<br \/>)/ 

這是假設所有<br />標籤字面上<br />,而不是<br><br/>,甚至<br style="clear:both;">。爲了更好的解析,你應該使用一個DOM解析器,並尋找BR節點,這些節點不會被其他節點立即執行,也不會被其他節點立即執行。

0

你指定要匹配一個
並用兩個替換它。

這不是你想要的 - 你只想添加一個額外的
如果那個沒有跟着第二個相同的東西?

嘗試

echo preg_replace('/(<br \/>\s*){1}([^<])/', '<br /><br />$1', $str); 

這保證了您匹配
後面沒有取代之前的任何其他標記。

注意,這不會在

<b>bob<br /></b> 

的情況下更換,但這樣你可能要更具體與您的結尾邊界 條件,只要你確保你添加它回最後,您可以根據自己的喜好使結束邊界變得複雜。

1

這取代的<br />任何數量的(大於零)有兩個:

print preg_replace('|(?:<br />)+|', '<br /><br />', $str); 

實施例:

$str = 'bob<br /><br />looked so good<br />tonight!<br /><br /><br />Bye!'; 
print preg_replace('|(?:<br />)+|', '<br /><br />', $str); 
# output: "bob<br /><br />looked so good<br /><br />tonight!<br /><br />Bye!" 
相關問題