从字符串末尾删除<p> </p>?

时间:2013-05-29 09:44:07

标签: php regex string

也许是一个新手问题:

我有一个字符串:

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

如何使用PHP regex(不是substr)删除最后一个字符,即<p>&nbsp</p>

我在这里找到了一个类似的问题: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'

我想我错过了一些逃避? &lt;&gt;还是斜杠?

感谢您的帮助。

5 个答案:

答案 0 :(得分:5)

您正在使用斜杠字符作为正则表达式分隔符,也是正则表达式的一部分(在结束标记中),因此您应该将其转义。所以:

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

应该是

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

而且似乎这不是正则表达式的工作,但这是你的电话.. str_replacestr_ireplace可以正常工作

答案 1 :(得分:2)

你能做的简单方法

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

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

答案 2 :(得分:0)

这应该可以解决问题:

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

这会替换所有空<p>,而不仅仅是那些包含&nbsp;

的空{{1}}

答案 3 :(得分: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>

答案 4 :(得分: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);