2013-05-29 58 views
2

也許一個新手的問​​題:刪除<p> </p>從字符串結尾?

我有這樣的字符串:

$string = '<p>this is what we need.</p><p>&nbsp</p>'; 

我怎麼能刪除最後一個字符,即<p>&nbsp</p>,使用PHP的正則表達式(不SUBSTR)?

我發現了一個類似的問題在這裏:remove <br>'s from the end of a string 與解決方案:preg_replace('/(<br>)+$/', '', $string);

但改變這:preg_replace('/(<p>&nbsp;</p>)+$/', '', $string); 不起作用。

它拋出PHP Warning: preg_replace(): Unknown modifier 'p'

我想我錯過了一些逃避? <>或斜線?

感謝您的幫助。

+2

請str_replace函數會工作。 –

+1

請注意,如果行的末尾只有一處出現(並取決於是否僅刪除最後一處或多處出現處),則不需要「+」。 –

回答

5

您正在使用斜槓字符作爲正則表達式分隔符,也作爲您的正則表達式的一部分(在關閉p標籤),所以你應該轉義它。所以:

/(<p>&nbsp;</p>)+$/ 

應該

/(<p>&nbsp;<\/p>)+$/ 

而且還似乎這不是那種工作的正則表達式,但它是你的電話.. str_replacestr_ireplace會做的工作就好了

+2

或者只是將分隔符更改爲'#' –

+0

@BurhanKhalid right;還有另一件需要注意的事情:如果這些東西需要從主題末尾刪除一個只匹配結尾的正則表達式(用於標記結尾的^字符)可能會有所幫助 – mishu

+0

感謝您的快速回復。我想使用str_replace,但並不是所有我得到的字符串最後都有一個'

&nbsp

'。這就是爲什麼我認爲我必須使用正則表達式。 #那麼你如何用str_replace來做到這一點? –

0

這應該做的伎倆:

$string = '<p>this is what we need.</p><p>&nbsp</p>'; 
$pattern = "/<p[^>]*>[\s|&nbsp;]*<\/p>/"; 
$string = preg_replace($pattern, '', $string); 

這將替換所有空<p>,而不僅僅是那些含有&nbsp;

2

簡單的方式,你可以做

$string = '<p>this is what we need.</p><p>&nbsp</p>'; 

$string = str_replace('<p>&nbsp</p>','',$string); 
+0

這是非常簡單的方法來刪除

&nbsp

0

不使用正則表達式,但保證當它是在年底將只有字符串:

$string = '<p>&nbsp</p><p>the previous and next &nbsp should remain</p><p>nbsp</p><p>this is what we need.</p><p>&nbsp</p><p>&nbsp</p><p>&nbsp</p><p>&nbsp</p>'; 
$lenString = strlen($string); 
$remove = '<p>&nbsp</p>'; 
$lenRemove = strlen($remove); 
while (strrpos($string, $remove) === $lenString - $lenRemove) { 
    $string = substr($string, 0, -$lenRemove); 
    $lenString = strlen($string); 
} 

echo $string, PHP_EOL; 

這打印<p>&nbsp</p><p>the previous and next &nbsp should remain</p><p>nbsp</p><p>this is what we need.</p>

0

在處理html內容(或url)時處理斜線的一種好方法是使用其他分隔符比斜線,例如:

$result = preg_replace('~(?><p>&nbsp;</p>)+$~', '', $string); 

那麼你不需要跳過斜槓。

注意,您可以刪除所有沒用有:

$result = preg_replace('~ 
(?> 
    <(\w++)[^>]*+>(?>\s++|&nbsp;|<br\s*+/?>)*</\1> # empty tags 
    |            # OR 
    (?>\s++|&nbsp;|<br\s*+/?>)+      # white spaces, br, &nbsp; 
)+$ 
         ~xi', '', $string); 
相關問題