You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:05:03