将多个<p>标记移除到单个标记</p>

时间:2013-03-21 13:12:46

标签: php regex

我需要替换所有:

<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>

<p>&nbsp;</p>

使用正则表达式我将如何做到这一点?

5 个答案:

答案 0 :(得分:1)

如果这是一个有限的案例,您可以使用preg_replace()来实现:

RegEx:(<p>&nbsp;<\/p>\s*)+
替换:\1

解释演示:http://regex101.com/r/vB5sZ0

答案 1 :(得分:0)

尽管有些评论正确地指出使用正则表达式解析HTML是危险的,但在受控环境中或者不需要解析时(我相信你的情况,因为你似乎只想更换一些东西)我认为它是最佳解决方案(尽管不是很完美)。

无论哪种方式,如果我正确理解您的问题,您想用单个实例替换多个重复项?在这种情况下,它可以通过正则表达式简单地实现:

 "<br><br>a<br><br><br>b".replace(/(<br>){2,}/g, '<br>');

该示例在javascript中(因为我可以从浏览器控制台测试它),但正则表达式和基本概念在php中是相同的:您匹配您感兴趣的字符串的两个或更多实例并替换它只有一个实例。

答案 2 :(得分:0)

您应该使用 html解析器而不是正则表达式。

但如果p标签未嵌套,您可以使用此正则表达式

/<p>&nbsp;</p>/

答案 3 :(得分:0)

你走了:

"<p>&nbsp;</p>\n<p>&nbsp;</p>\n<p>&nbsp;</p>"

    .replace(/(<p>&nbsp;<\/p>\n?)+/, "<p>&nbsp;</p>");

答案 4 :(得分:0)

如果您不想使用正则表达式,请使用str_replace

将所有<p>&nbsp;</p><p>&nbsp;</p>替换为1并执行此操作直到不做任何更改。

$input2 = $input_text;
$end = false;

while(!$end){
  $temp_text=str_replace("<p>&nbsp;</p><p>&nbsp;</p>","<p>&nbsp;</p>", $input2);
  if($temp_text == $input2){
    $end = true;
    }
  else{
    $input2 = $temp_text;
  }
}

str_replace()行中,您可能需要添加换行符(\n)和/或换行符(\r)。