正则表达式模式(...)+不匹配多次

时间:2016-07-12 15:46:14

标签: php regex pattern-matching

我正在构建一个PHP脚本,它将筛选cURL请求的HTML内容并匹配URL的模式,以便我可以操作添加GET标记来跟踪出站链接。

我有正则表达式正在运行,但我不能让它不止一次匹配;它甚至找不到它匹配的项目的副本。

这是示例HTML,目前只匹配第一个Anchor标记:

`<html><head>
 <title></title>
</head>
<body class="body class">
 <div>
   <a title="1hubwhrrstn" href="http://www.example.com?tag=9qgbc"></a>
   <a name=""></a>
   <a class="3hubwhbbsrstn" href="http://www.example.com?tag=uqgibc"></a>
   <a class="4whbihbw4bsetrrstn" href="http://www.example.com?tag=9uq4i"></a>
   <a href="http://www.example.com?tag=9uq4i" class="4whbihbstn"></a>
 </div></body>
</html>`

我正在使用的正则表达式模式是:(<a.*href=".*".*><\/a>)+/im,它只匹配第一个锚点实例。

另外,我找不到一种方法告诉它匹配一条新线或全部在一条线上 - 它给了我一个匹配,当它们在同一条线上时,它们一起运行多个Anchor标签,即使我' m使用捕获组将模式匹配到一个锚标记。所以在这种情况下,它找到一个匹配 - 即使是同一行上的双重锚点:

`<html><head>
 <title></title>
</head>
<body class="body class">
 <div>
   <a title="1tn" href="http://www.example.com"></a><a class="3htn" href="http://www.example.com"></a>
   <a name=""></a>
   <a class="4whbihbw4bsetrrstn" href="http://www.example.com?tag=9uq4i"></a>
   <a href="http://www.example.com?tag=9uq4i" class="4whbihbstn"></a>
 </div></body>
</html>`

我经历了两个小时的修补和双重检查标志和量词,测试我在regex101.com上进行测试,无法确定我在哪里犯了错误。

任何帮助都会很棒。非常感谢!

2 个答案:

答案 0 :(得分:1)

你的正则表达式(<a.*href=".*".*><\/a>)+/im是贪婪的。为了减少贪心,你可以拒绝在锚标记内有<的任何模式:

(<a.*href=".*".*>[^<]*<\/a>)+/im

这解决了另一个潜在的问题:没有内容的锚标签是不寻常的,并且这个模式匹配标签中的任何内容,只要它不是另一个标签(当然,html中允许其他标签在html中,所以这解决方案可能还不够。)

另外,我不确定你最后需要m修饰符。它用于匹配跨越多行的模式,似乎您的匹配模式都在一行上。

答案 1 :(得分:1)

我猜你在使用preg_match()?使用preg_match_all()进行全球注册匹配,因为您无法将g修饰符与preg_match()

一起使用