我正在寻找一个正则表达式,它会删除关闭的标签以及所有内容,直到找到一个打开的标签。例如:
</xy>..</zz>..<a>...
- &gt; <a>...
</b>..</cc>..<a href="#">...</a>
- &gt; <a href="#">...</a>
我试过这个,但由于某种原因不起作用:
$html = preg_replace("/^.*<.*>/","<.*>",$html);
答案 0 :(得分:1)
在regex下面会捕获并将开始标记之前的所有文本存储到一个组(group1
)中,并且它还会捕获剩余字符串并将其存储到另一个组中。因此第二组包含开始标记中的文本。
(.*)(<\w.*)
您的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
这是第一个开放标签的所有内容。