如何使用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
相关产品推荐
相关产品推荐

