4

也许是一个新手问题:

我有一个像这样的字符串:

$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 with solution:preg_replace('/(<br>)+$/', '', $string);

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

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

我想我错过了一些逃避?<> 还是斜线?

谢谢你的帮助。

4

5 回答 5

7

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

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

应该

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

而且似乎这不是正则表达式的工作,但这是你的电话.. str_replacestr_ireplace可以很好地完成这项工作

于 2013-05-29T09:46:39.730 回答
3

你可以做的简单方法

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

$string = str_replace('<p>&nbsp</p>','',$string);
于 2013-05-29T09:50:03.810 回答
0

这应该可以解决问题:

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

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

于 2013-05-29T09:48:57.897 回答
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>

于 2013-05-29T10:03:01.530 回答
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);
于 2013-05-29T11:09:38.503 回答