提问人:Epiphanisation 提问时间:1/24/2011 最后编辑:John ParkerEpiphanisation 更新时间:1/25/2011 访问量:412
用于从 HTML 中提取链接的正则表达式
Regular expressions to pull links from HTML
问:
嗨,我尝试使用正则表达式从 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 表达式作用于文本。
答:
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
很酷,我会看看这个,看看我是否可以轻松实现它。干杯
评论