我有这个正则表达式:
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
答案 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*['|\"](.*?\?.*?)(?=#|\"|')
如图所示: