我是一个使用正则表达式的完全新手,我现在感觉很糟糕,当我需要一些关于如何从ahref标签中提取链接名称的严肃建议时,即
<a href="article.html?id=1999874">This article is cool</a>
我需要提取“这篇文章很酷”,并指出“article.html?id =”无法避免。我用
试了一下preg_match_all('/<a href="article.html?id=([0-9])">([^<]*)<\/a>/', $webpage, $match);
我得到的只是
Array ( [0] => Array ( ) [1] => Array ( ) [2] => Array ( ) )
感谢任何有价值的建议!
答案 0 :(得分:0)
Onetrickpony了解了你的正则表达式的错误:你的数字ID有多个数字,但你的正则表达式只匹配一个数字。
还有其他一些我要抛弃的东西供你考虑。首先,如果<a>
标记中还有其他属性,则正则表达式将失败。例如,如果存在target="_blank"
属性,则会破坏正则表达式。幸运的是,有一个简单的方法:
preg_match_all('/<a .*?href="article\.html\?id=([0-9]+)".*?>(.*?)<\/a>/',
$webpage, $match);
基本上,我只是用href
填充.*?
属性。问号使匹配 lazy (而不是默认的 greedy ),这将阻止它消耗超过您想要的消耗。我还用惰性匹配替换了你的[^<]
,因为我通常觉得它更清洁。
更新:正如恶作剧正确指出的那样,article.html?id=
中的句点和问号需要被转义。这段时间并不重要,除了将它留在那里将匹配article_html
或其他任何东西,这可能不是一个问题。但是,没有逃避问号是麻烦。它使l
中的html
成为可选项,但实际上没有任何内容可以匹配问号,这可能就是我未修正的解决方案失败的原因。谢谢,恶搞!
答案 1 :(得分:0)
你的正则表达式应该是这样的:
<a(.+)?href="article\.html\?id=([0-9]+?)">(.+)?<\/a>
问题是,如果有人将某些类或id包含在你的href中。 然后正则表达式将无法正常工作。
示例:
<?php
$str = '<a href="article.html?id=1999874">This article is cool</a>';
$matches = array();
preg_match_all('/<a.?href="article\.html\?id=([0-9]+?)">(.+)?<\/a>/',$str,$matches);
var_dump($matches);
?>
输出:
array(3) {
[0]=>
array(1) {
[0]=>
string(58) "<a href="article.html?id=1999874">This article is cool</a>"
}
[1]=>
array(1) {
[0]=>
string(7) "1999874"
}
[2]=>
array(1) {
[0]=>
string(20) "This article is cool"
}
}