使用正则表达式删除不必要的关闭标记

时间:2014-06-24 12:19:05

标签: php regex preg-replace

我正在寻找一个正则表达式,它会删除关闭的标签以及所有内容,直到找到一个打开的标签。例如:

</xy>..</zz>..<a>... - &gt; <a>...

</b>..</cc>..<a href="#">...</a> - &gt; <a href="#">...</a>

我试过这个,但由于某种原因不起作用:

$html = preg_replace("/^.*<.*>/","<.*>",$html);

2 个答案:

答案 0 :(得分:1)

在regex下面会捕获并将开始标记之前的所有文本存储到一个组(group1)中,并且它还会捕获剩余字符串并将其存储到另一个组中。因此第二组包含开始标记中的文本。

(.*)(<\w.*)

DEMO

您的PHP代码将是,

<?php
$re = '~(.*)(<\w.*)~'; 
$str= '</b>..</cc>..<a href="#">...</a> -> <a href="#">...</a>';
$replacement = "$2";
echo preg_replace($re, $replacement, $str);
?> //=>  <a href="#">...</a>

OR

<?php
$re = '~(?:.*)(<\w.*)~'; 
$str= '</p>\n<p>Â </p>';
$replacement = "$1";
echo preg_replace($re, $replacement, $str);
?>

<强>解释

  • (.*)(<\w.*)从字符串的开头捕获并在找到<字符的\w字符时停止捕获。 <\w之前的字符串存储在组1中,<\w之后的字符串存储在group2中(包括<\w)。

答案 1 :(得分:0)

如果我正确理解您对Avinash Raj的回答,您需要的内容与第一个开放标记的任意数量的输入行相匹配,但只匹配一次,以便维护所有后续内容。

.*(\n.*?)*?(<\w.*(\n.*)*)

第一部分

.*(\n.*?)*?

匹配任意数量的行但不贪婪(因此是?),因此它将在包含开放标记的第一行停止:

<\w

然后再通过任意数量的任何行进行:

.*(\n.*)*

所以提取你想要的东西你会替换

.*(\n.*?)*?(<\w.*(\n.*)*)

\2

这是第一个开放标签的所有内容。