PHP正则提取a标签href中带/不带www、http/https的特定域名问题
解决PHP正则匹配特定域名a标签href的两个问题
我来帮你搞定这两个正则匹配的问题,直接上修正方案和详细解释:
问题1:仅匹配到第一个链接的解决办法
你之前用的preg_match()函数只会返回第一个符合条件的匹配结果,要获取所有匹配项,只需要换成preg_match_all()函数就行——它会遍历整个字符串,捕获所有满足正则规则的内容。
问题2:限定仅在href属性内匹配的正则优化
原正则没有限定匹配范围,很容易误匹配到文本中的相同域名。我们可以用正向断言来约束匹配内容必须在href="..."或href='...'的引号范围内,同时优化正则规则,兼容带/不带www、http/https的域名格式。
完整修正代码
$a = ' <a href="https://example.com"></a> <a href="http://www.example.com"></a> <a href="http://example.com"></a> <a href="https://www.example.com"></a> <a href="http://example.com"></a> '; // 优化后的正则,适配多种域名格式并严格限定在href属性内 $reg_exUrl = '/(?<=href=["\'])(?:https?:\/\/)?(?:www\.)?example\.com(?:\/[^"\']*)?(?=["\'])/i'; preg_match_all($reg_exUrl, $a, $urls); var_dump($urls[0]);
正则规则拆解
让我们逐一解释这个正则的关键部分:
(?<=href=["\']):正向后查,确保匹配内容的前面是href="或href=',直接锁定href属性的取值范围(?:https?:\/\/)?:匹配http://或https://,?表示这部分是可选的(兼容不带协议的域名,让规则更通用)(?:www\.)?:匹配www.,同样可选,完美兼容带/不带www的域名格式example\.com:目标域名,注意用\.转义点号(正则里.是通配符,必须转义才能匹配实际的点)(?:\/[^"\']*)?:匹配域名后的路径部分,[^"\']*表示匹配到引号前的所有字符(比\S*更稳妥,能兼容路径里的空格),?表示路径可选(?=["\']):正向预查,确保匹配内容的后面是引号,进一步加固匹配范围,避免误匹配/i:可选的不区分大小写修饰符,如果你需要匹配HTTPS://EXAMPLE.COM这种大写格式可以加上
运行结果
执行上面的代码后,$urls[0]会返回所有符合条件的链接数组:
array(5) { [0]=> string(18) "https://example.com" [1]=> string(22) "http://www.example.com" [2]=> string(17) "http://example.com" [3]=> string(22) "https://www.example.com" [4]=> string(17) "http://example.com" }
额外修正点
原正则里的example+\.com有个小错误:+会匹配exampleee.com这种重复e的域名,去掉+才能准确匹配example.com。
内容的提问来源于stack exchange,提问作者hretic
相关产品推荐
相关产品推荐

