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

如何使用PHP preg_replace正则表达式仅保留href链接

嘿,我明白你要的效果了——原来的代码是把所有<a>标签都删掉,完全搞反啦!你需要的是只保留HTML里带href的链接,把其他杂七杂八的内容都去掉对吧?我来给你调整正则,搞定这个需求~

正确实现方案

我们要做的是提取所有带href属性的<a>标签,移除其他所有内容,这里有两种靠谱的实现方式:

方式1:保留完整的<a>标签结构

用preg_match_all捕获所有符合要求的<a>标签,再把它们拼接起来,这比单次替换更可靠,能拿到所有链接:

<?php
$string = "<li>123<a href=\"https://stackoverflow.com/questions/ask\"><img src=\"https://cdn.sstatic.net/Sites/stackoverflow/img/sprites.svg\"></a>remove me<a href=\"https://stackoverflow.com/questions/ask\"></a>Jumat, 20 April 2018 14:15 This string for removed.</li>";

// 匹配所有带href的<a>标签
preg_match_all('%<a\s+[^>]*href="[^"]+"[^>]*>.*?</a>%si', $string, $matches);

// 把所有匹配到的标签拼接成字符串
$cleanedContent = implode(' ', $matches[0]);

echo $cleanedContent;
?>

正则细节说明

这个正则%<a\s+[^>]*href="[^"]+"[^>]*>.*?</a>%si的作用:

  • s修饰符:让.能匹配换行符,避免标签跨换行时匹配失败
  • i修饰符:忽略大小写,兼容<A>这种大写标签写法
  • <a\s+:确保<a>标签开头后有至少一个空格,避免匹配<ahref>这种不规范的代码
  • [^>]*href="[^"]+":精准捕获带href属性的标签,[^"]+会完整匹配href里的URL(直到闭合引号)
  • [^>]*>:匹配标签里的其他属性(比如class、target)和闭合的>
  • .*?</a>:匹配标签内部的所有内容(比如图片、文字)直到闭合的</a>

方式2:只提取href里的纯URL

如果你不需要<a>标签结构,只想要链接地址,可以调整正则捕获href的内容:

<?php
$string = "<li>123<a href=\"https://stackoverflow.com/questions/ask\"><img src=\"https://cdn.sstatic.net/Sites/stackoverflow/img/sprites.svg\"></a>remove me<a href=\"https://stackoverflow.com/questions/ask\"></a>Jumat, 20 April 2018 14:15 This string for removed.</li>";

// 捕获所有href属性里的URL
preg_match_all('%<a\s+[^>]*href="([^"]+)"[^>]*>.*?</a>%si', $string, $matches);

// $matches[1]里就是所有提取到的纯URL
foreach($matches[1] as $url) {
    echo $url . '<br>';
}
?>

为什么原来的代码不行?

你之前的preg_replace('%<a.*?</a>%i', '', $string)是把所有<a>标签替换成空,相当于把你想要保留的内容删掉了,完全和需求反向,所以才达不到预期效果~

内容的提问来源于stack exchange,提问作者Hedi Herdiana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:30:00