移除& lt; p>,, & lt; / p>从字符串结束


Remove <p>&nbsp;</p> from end of string?

可能是个新手问题:

我有一个这样的字符串:

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

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

我在这里发现了一个类似的问题:从字符串的末尾删除
s溶液:preg_replace('/(<br>)+$/', '', $string);

但将其改为:preg_replace('/(<p>&nbsp;</p>)+$/', '', $string);不工作。

抛出PHP Warning: preg_replace(): Unknown modifier 'p'

我猜我错过了一些逃脱?<>还是斜杠?

谢谢你的帮助。

您使用斜杠字符作为regex分隔符,也作为regex的一部分(在结束p标记中),因此您应该转义它。所以:

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

应为

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

而且似乎这不是一个正则表达式的那种工作,但它是你的呼叫…Str_replace或str_ireplace就可以了

方法很简单

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

这应该能奏效:

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

这将取代所有空的<p>,而不仅仅是那些包含&nbsp;

不使用正则表达式,但保证只删除位于末尾的字符串:

$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>

处理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);