href标签的名称

时间:2013-12-11 18:22:35

标签: php regex html-parsing preg-match preg-match-all

我是一个使用正则表达式的完全新手,我现在感觉很糟糕,当我需要一些关于如何从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 ( ) )

感谢任何有价值的建议!

2 个答案:

答案 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"
  }
}