1

这是我的字符串:

$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"

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

"<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 是否会在删除 a 标签后立即出现。

4

2 回答 2

1

您非常接近可行的解决方案。您面临的问题是,默认情况下正则表达式会尝试尽可能多地匹配。如果模式介于两者之间,则该模式<a(.*)LINK1(.*)</a>实际上将匹配第一个 <a最后一个。 你想要的只是得到最近的标签。</a>LINK1<a>

有几种方法可以做到这一点,但我通常会让匹配变得不贪心。然后它将尝试找到最小的可能匹配项。这样做的两种方法是?在量词之后附加 a 或使用ungreedy 修饰符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 代码,或者这种匹配的结果对于其他重要功能并不重要,那是完全可以的。

于 2012-07-28T12:15:53.317 回答
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);
于 2012-07-28T12:05:49.463 回答