正则表达式删除特定字符串周围的标记

时间:2012-07-28 11:56:15

标签: php regex html-parsing

这是我的字符串:

$str="<p>Some <a href="#">link</a> with <a href="http://whatever.html?bla">LINK2</a> and <a href="http://whatever.html?bla" target="_blank">LINK3</a> and</p> more html"

我想删除链接LINK1和LINK2使用php获取:

"<p>Some <a href="#">link</a> with and and</p> more html"

以下是我认为接近我需要的内容:

$find = array("<a(.*)LINK1(.*)</a>", "<a(.*)LINK2(.*)</a>");
$replace = array("", "");
$result=preg_replace("$find","$replace",$str);

这不起作用。我已经搜索了几天并尝试了许多其他选项,但从未设法让它按预期工作。此外,我不介意在删除标签后立即显示LINK1和2。

2 个答案:

答案 0 :(得分:1)

您非常接近有效的解决方案。您面临的问题是每个默认值的正则表达式尽可能匹配。事实上,模式<a(.*)LINK1(.*)</a>会将第一个 <a last </a>匹配,如果它们之间有LINK1的话。你想要的只是得到最近的<a>标签。

有几种方法可以做到这一点,但我通常会选择不匹配的方式。然后它会尝试找到最小的匹配。两种方法是在量词之后附加?或使用ungreedy modifier U。我更喜欢第一个。

使用?

/<a(.*?)LINK1(.*?)<\/a>/

使用修饰符:

/<a(.*)LINK1(.*)<\/a>/U

两者在这里应该同样有效。因此,整个源代码如下(使用?):

$find = array("/<a(.*?)LINK1(.*?)<\/a>/", "/<a(.*?)LINK2(.*?)<\/a>/");
$replace = array("", "");
$result = preg_replace($find, $replace, $str);

是的,正如在其他评论中所指出的那样,你不应该依赖正则表达式来操纵HTML代码(因为构建有效的HTML代码非常容易,而这些代码将不会被注意到)。但是,我相信如果您信任您解析的HTML代码或者这种匹配的结果对其他重要功能并不重要,那就完全没问题了。

答案 1 :(得分:0)

试试这个:

<?php
$str='<p>Some <a href="#">link</a> with <a href="http://whatever.html?bla">LINK2</a> and <a href="http://whatever.html?bla" target="_blank">LINK3</a> and</p> more html';
$find = array("/<a(.*)LINK1(.*)<\/a>/si", "/<a(.*)LINK2(.*)<\/a>/si");
$replace = array("", "");
$result=preg_replace($find, $replace, $str);