2012-07-28 80 views
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" 

我想链接1和连接2使用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在移除a标签后立即出现。

+0

请不要使用正则表达式解析HTML,因为它会[驱动你į̷̷͚̤̤̖̦͍͗̒̈̅̄n̨͖͓̹͍͎͔͈̝͐ͪ͛̄͛ṣ̷̵̞̦ͤ̅̉̋ͪ͑͛ͥ͜a̷̘͖̮͔͎͛̇̏̒͆̆͘n͇͔̤̼͙̩͖̭ͤ͋̉͌͟eͥ͒͆ͧͨ̽͞҉̹͍̳̻͢](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454 #1732454)。改为使用[HTML解析器](http://stackoverflow.com/questions/292926/robust-mature-html-parser-for-php)。 – 2012-07-28 22:34:26

+0

**不要使用正则表达式来解析HTML。使用合适的HTML解析模块**您无法可靠地使用正则表达式解析HTML,并且您将面临悲伤和挫折。只要HTML从你的期望改变,你的代码就会被破坏。请参阅http://htmlparsing.com/php或[this SO thread](http://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php)如何使用已经编写,测试和调试的PHP模块正确解析HTML的示例。 – 2013-08-29 19:49:50

回答

1

你非常接近一个有效的解决方案。您面临的问题是每个默认的正则表达式尽可能匹配。该模式<a(.*)LINK1(.*)</a>实际上将匹配第一<a最后</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代码,或者此匹配的结果对其他重要功能不是至关重要的,那就完全可以。

+0

非常感谢您的帮助和详细解释!这接缝工作得很好,但你和Lix说我不应该使用正则表达式,所以我要去看DOM解析器..希望它不会更难:) – 2012-07-28 12:28:53

+1

这一切取决于你如何使用它。使用不当:使用它从网络访问者的文本中删除不需要的内容(如博客评论的过滤系统)。确定用法:使用它来处理之前编写的HTML代码(或其他_impossibly_有意破解你的源代码)。另一个半正确的用法:扫描另一个网页的东西。 – alaeus 2012-07-28 12:42:25

+0

好的Alaeus,我的内容只来自可信任的来源,所以我应该可以使用REGEXP!感谢您的评论。你们是否也知道如何匹配包含“@”和数字“1”的链接? – 2012-07-28 12:58:27

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); 
+0

感谢您的回复,不幸的是,这个接缝取代的不仅仅是链接 – 2012-07-28 12:14:16

+0

[用正则表达式解析HTML内容被认为是一个坏主意](http://stackoverflow.com/a/1732454/558021)。 XML或DOM解析器将是一个更好的选择。 – Lix 2012-07-28 12:14:52

+0

感谢Lix的信息 – 2012-07-28 12:29:15

相关问题