PHP preg_match在href链接中获取$ _GET值

时间:2014-05-16 14:35:54

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

我希望从下面的示例中获得t 558246017值,例如$str = '<a target="frameleft" href="Home.aspx?t=558246017">START</a>'; preg_match_all('/<a target="frameleft" href="Home.aspx?t=\d+">(.*?)<\/a>/si', $str, $matches); print_r($matches); preg_match_all函数无法正确执行。

{{1}}

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:3)

HTML不是常规语言,无法使用正则表达式进行可靠解析。我建议你使用DOM解析器。 PHP有一个内置类(DOMDocument),擅长这些任务。使用HTML解析器而不是正则表达式的优点是,您始终可以确定结果。当标记的格式将来发生变化时,基于正则表达式的解决方案可能会中断,而基于DOM解析器的解决方案则不会。

您可以使用DOMDocument加载字符串并首先获取href属性值。然后使用parse_url()parse_str()获取所需的参数:

$str = '<a target="frameleft" href="Home.aspx?t=558246017">START</a>';

$dom = new DOMDocument;
$dom->loadHTML($str);

foreach ($dom->getElementsByTagName('a') as $tag) {
    $querystr = parse_url($tag->getAttribute('href'), PHP_URL_QUERY);
    parse_str($querystr, $params);
    echo $params['t'] . PHP_EOL;
}

输出:

558246017

Demo

答案 1 :(得分:2)

HTML不是常规语言,因此您should not use regular expressions to parse it。使用像DOMDocument这样的DOM解析器。但是,为了学习,我会告诉你表达的错误。

但是,您的问题是?reserved character表示“可选”,.是保留字符,表示任何字符。使用\隐藏它们:

<a target="frameleft" href="Home\.aspx\?t=\d+">(.*?)<\/a>

此外,s modifier表示点匹配换行符。因此,除非您希望链接中包含换行符,否则这是不必要的。


我也注意到你想要“t”值。目前,您对链接((.*?))的内容使用了capture group,而您想要捕获t(\d+)的值。您需要将其修改为:

<a target="frameleft" href="Home\.aspx\?t=(\d+)">.*?<\/a>