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

Regular expressions to pull links from HTML

提问人:Epiphanisation 提问时间:1/24/2011 最后编辑:John ParkerEpiphanisation 更新时间:1/25/2011 访问量:412

问:

嗨,我尝试使用正则表达式从 html 的 pice 中提取链接,如下所示:

<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 表达式,要么通过做一些事情来删除 carrage 返回,因为 reg 表达式作用于文本。

PHP 正则表达式

评论

3赞 BoltClock 1/24/2011
你的HTML是故意拼写错误的吗?看起来确实如此。
0赞 Ass3mbler 1/24/2011
你能对输入进行预处理,去除所有换行符吗?
4赞 Hello71 1/24/2011
stackoverflow.com/questions/1732348/......
0赞 Epiphanisation 1/24/2011
嗨,boltclock,是的,我收到关于问题框中有多个链接的错误,所以我无法粘贴问题。我是新来的,所以还不确定如何使用 propper!所以我试着让 html 不支持 html,这样它就不会对链接进行比较。
0赞 Epiphanisation 1/24/2011
嗨,ass3mbler,是的,如果这比使正则表达式更通用并且不会因 carrage 返回而感到不安,那么预先起诉输入字符串是一种可能性。关于使用哪种预处理方法的任何建议?字符串替换?只需要注意它不会在字符串中设置任何其他内容,但它不应该,因为 carrage 返回的内容应该是丝网印刷文本的 html 标签。

答:

0赞 kelloti 1/24/2011 #1

使用该选项可使 .匹配所有字符。看这个s

评论

0赞 André Paramés 1/24/2011
如果鱼男孩不知道线在哪里,他会把点插入哪里?
0赞 kelloti 1/24/2011
这是编程部分。这是一个广泛的正则表达式,有很多特殊字符。这并不难,只是生产起来很耗时。他必须使用大量的字符集等。\s*
0赞 Epiphanisation 1/24/2011
不要完全遵循这个。正如安德烈所说,我应该把点放在哪里,因为卡拉奇返回可能发生在 <a> 标签之间的任何地方。希望你不建议我必须把它放在其他每个角色中?
0赞 Epiphanisation 1/24/2011
您能详细说明一下如何使用 S 点和使用大量 \s* 集合吗?
2赞 mario 1/24/2011 #2

您可以使用它来消除多余的空格和换行符。此外,您应该通过用否定字符类替换每个字符类来使其更加严格:\s*[\d\D]*

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

您可能希望在等号之前和之后应用更多。这是忽略额外 html 属性的常用成语,同样适用于匹配 html 属性,同时匹配不包含 html 标签的文本内容。\s*[^>][^"][^<]

此外,此版本仅返回 $matches[1] 形式的 URL(而不是完整标签),并返回包含的文本 $matches[2]。

评论

0赞 Epiphanisation 1/24/2011
不幸的是,只有当 carrage 返回在 = 符号之后时,您的匹配才有效,因为我需要它仍然匹配字符串中 carrage 返回发生的位置。我喜欢其他部分,但它们同样不适用于我正在演奏的琴弦,但它增加了我的知识,因为不会想到使用负面字符类那么多。不确定 # 在开头和结尾做了什么,必须查找那个。谢谢你的帖子。
4赞 AJJ 1/24/2011 #3

html解析器可以为您完成这项工作,而不会出现任何错误,并且simplehtmldom使用起来非常简单(需要php 5+): http://simplehtmldom.sourceforge.net/

评论

0赞 Epiphanisation 1/24/2011
很酷,我会看看这个,看看我是否可以轻松实现它。干杯