正则表达式从HTML中提取链接

时间:2011-01-23 19:15:51

标签: php regex

您好我正在尝试使用正则表达式从html中删除链接,如下所示:

<p>some random text < hr ef="http://url.co.uk/link/">link text</a> some more random text.</p>

我使用的reg表达式是:

preg_match_all('/(< href="http:\/\/url.co.uk\/([\d\D]*?)\/">([\d\D]*?)<\/a>)/', $content, $matches);

在链接的一部分由于换行而在其中间返回时,其工作正常,如下所示:

<p>some random text < href="
http://url.co.uk/link/">link text</a> some more random text.</p>

carrage返回可以是链接中的任何位置,意味着链接不匹配。

任何人都可以建议一种解决这个方法的方法,或者通过做一些事情来删除因为reg表达式对文本的影响而删除的回报。

3 个答案:

答案 0 :(得分:4)

html解析器可以为你完成工作而没有错误,simplehtmldom使用非常简单(需要php 5+):http://simplehtmldom.sourceforge.net/

答案 1 :(得分:2)

您可以使用\s*来消除无关的空白和换行符。另外,你应该用一个否定的字符类替换每个[\d\D]*来使它更严格:

preg_match_all('#<a[^>]+href="\s*(http://url.co.uk/[^"]+)">([^<]+)</a>#'

您可能希望在等号前后应用更多\s*[^>]是忽略额外html属性的常用习惯用法,[^"]同样最适合匹配html属性,而[^<]则匹配不包含html标记的文本内容。

此外,此版本仅返回URL(不是完整标记)作为$ matches [1],包含的文本作为$匹配[2]。

答案 2 :(得分:0)

使用s选项获取。匹配所有字符。请参阅this