【问题标题】:Regular expression Remove tags around a specific string正则表达式删除特定字符串周围的标签
【发布时间】:2012-07-28 11:56:15
【问题描述】:

这是我的字符串:

$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 标签后立即出现。

【问题讨论】:

标签: php regex html-parsing


【解决方案1】:

您非常接近可行的解决方案。您面临的问题是,默认情况下正则表达式会尝试尽可能多地匹配。 &lt;a(.*)LINK1(.*)&lt;/a&gt; 模式实际上会将 first &lt;a 匹配到 last &lt;/a&gt;,如果它们之间有 LINK1。你想要的只是获得最近的&lt;a&gt; 标签。

有几种方法可以做到这一点,但我通常会让匹配变得不贪心。然后它将尝试找到最小的可能匹配项。执行此操作的两种方法是在量词后附加? 或使用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);

是的,正如在其他 cmets 中所指出的,您不应该依赖正则表达式来操作 HTML 代码(因为很容易构造有效的 HTML 代码,而不会注意到表达式)。但是,我相信如果您信任您解析的 HTML 代码,或者这种匹配的结果对于其他重要功能并不重要,那是完全可以的。

【讨论】:

  • 非常感谢您的帮助和详细的解释!这个接缝效果很好,但你和 Lix 说我不应该使用正则表达式,所以我要研究 DOM 解析器。希望不会更难:)
  • 这一切都取决于你如何使用它。不好的用法:使用它从来自网络访问者的文本中删除不需要的内容(如博客 cmets 的过滤系统)。好的用法:使用它来处理您之前编写的 HTML 代码(或 不可能 有意破解您的其他来源)。另一个半确定的用法:扫描另一个网页以查找内容。
  • 好的 Alaeus,我的内容仅来自受信任的来源,所以我应该能够使用 REGEXP!感谢您的评论。你们还知道我如何匹配包含“@”和数字“1”的链接吗?
  • 我不确定我是否理解。 /&lt;a(.*?)&gt;[@\d]+&lt;\/a&gt;/ 将匹配 包含@ 和数字的链接。这就是你所追求的吗?
  • 对不起,Alaeus,我只是想删除一个电子邮件地址,所以这样做了:$find='email@address.com' 我的问题很愚蠢,我没有使用引号,这就是我有一个错误...
【解决方案2】:

试试这个:

<?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);

【讨论】:

猜你喜欢
  • 2020-10-27
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 2011-11-05
  • 2011-07-03
  • 2016-05-26
相关资源
最近更新 更多