PHP正则表达式:获取带问号的所有网址

时间:2013-06-15 05:35:12

标签: php regex html-parsing

我有这个正则表达式:

preg_match_all("/<a\s.*?href\s*=\s*['|\"](.*?)(?=#|\"|')/si", $data, $matches);

找到所有网址,它运行正常,但我怎么修改它才能找到带问号的网址?

示例:

<a href="http://site.com/index.php">0</a><a href="http://site.com/index.php?id=1">1</a><a href="http://site.com/calc/index.php?id=1&scheme=Venus">2</a><a href="http://site.com/catalogue/data.php">3</a>

preg_match_all将返回:

http://site.com/index.php?id=1

http://site.com/calc/index.php?id=1&scheme=Venus

3 个答案:

答案 0 :(得分:1)

preg_match_all("@<a\s*href\s*=[\'\"]([^\'\"]+\?[^\'\"]+)[\'\"]@si", $data, $matches);

试试这个。

答案 1 :(得分:0)

不要试图在一个正则表达式中完成所有事情。使用现有方法,然后单独检查您返回的URL,看它是否有问号。

那就是说,不要使用正则表达式来解析HTML 。你不能用正则表达式可靠地解析HTML,你将面临悲伤和挫折。一旦HTML改变了您的期望,您的代码就会被破坏。有关如何使用已编写,测试和调试过的PHP模块正确解析HTML的示例,请参阅http://htmlparsing.com/php

答案 2 :(得分:0)

Andy Lester给你的答案是正确的。

这是你的正则表达式:

<a\s.*?href\s*=\s*['|\"](.*?\?.*?)(?=#|\"|')

如图所示:

http://rubular.com/r/LHi11VMMR9