我正在构建一个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上进行测试,无法确定我在哪里犯了错误。
任何帮助都会很棒。非常感谢!
答案 0 :(得分:1)
你的正则表达式(<a.*href=".*".*><\/a>)+/im
是贪婪的。为了减少贪心,你可以拒绝在锚标记内有<
的任何模式:
(<a.*href=".*".*>[^<]*<\/a>)+/im
这解决了另一个潜在的问题:没有内容的锚标签是不寻常的,并且这个模式匹配标签中的任何内容,只要它不是另一个标签(当然,html中允许其他标签在html中,所以这解决方案可能还不够。)
另外,我不确定你最后需要m
修饰符。它用于匹配跨越多行的模式,似乎您的匹配模式都在一行上。
答案 1 :(得分:1)
我猜你在使用preg_match()
?使用preg_match_all()
进行全球注册匹配,因为您无法将g
修饰符与preg_match()