这是我的字符串:
$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。
答案 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);