PHP技术需求:移除图片及普通文本超链接,保留指定站点链接
问题描述
需求:保留文本、图片内容,仅保留指定站点(如twitter.com、t.co)的超链接。
现有PHP代码:
<?php $Content = 'text <a href="https://www.somesite.com/" title="test"><img src="imagelink.jpg"/></a> some text <a href="https://www.twitter.com/rere" title="test">twitttter.com</a> other random text'; $keepImage = preg_replace('/<a.*?(<img.*?>)<\/a>/', '$1', $Content); $allowed = array("twitter.com","t.co"); preg_match_all('/<\/?a[^>]*>/', $Content, $matches); foreach($matches[0] AS $link){ foreach($allowed AS $site){ if(strpos($link, $site) !== false){ continue 2; } } $Content = str_replace($link, '', $Content); } echo $Content; ?>
当前执行结果:
text <img src="imagelink.jpg"/> some text <a href="https://www.twitter.com/rere" title="test">twitttter.com other random text
期望结果:
text <img src="imagelink.jpg"/> some text <a href="https://www.twitter.com/rere" title="test">twitttter.com</a> other random text
核心问题:允许保留的超链接的</a>闭合标签被误删,导致链接结构不合法。
问题原因
原代码通过preg_match_all单独提取所有<a>起始标签和</a>结束标签,逐个检查标签字符串里是否包含允许的站点域名。但</a>标签本身不带域名,会被判定为“不允许”而被替换删除,最终合法链接的闭合标签丢失。
解决方案
直接匹配完整的<a>链接(从<a>到</a>),根据href属性判断是否属于允许站点,分情况处理:
- 允许的链接:保留完整结构
- 不允许的链接:内部是图片则保留图片标签,普通文本链接则直接移除整个链接
修改后的代码:
<?php $Content = 'text <a href="https://www.somesite.com/" title="test"><img src="imagelink.jpg"/></a> some text <a href="https://www.twitter.com/rere" title="test">twitttter.com</a> other random text'; $allowed = array("twitter.com", "t.co"); // 处理所有完整<a>链接 $Content = preg_replace_callback('/<a[^>]+href="([^"]+)"[^>]*>(.*?)<\/a>/si', function($matches) use ($allowed) { $href = $matches[1]; $linkContent = $matches[2]; // 检查href是否包含允许的站点 $isAllowed = false; foreach ($allowed as $site) { if (strpos($href, $site) !== false) { $isAllowed = true; break; } } if ($isAllowed) { // 保留完整链接 return $matches[0]; } else { // 非允许链接:是图片则保留图片标签,否则移除整个链接 return preg_match('/<img[^>]+>/i', $linkContent) ? $linkContent : ''; } }, $Content); echo $Content; ?>
代码说明
- 使用
preg_replace_callback匹配完整<a>链接,捕获href属性和链接内部内容; - 校验
href是否包含允许的站点域名,符合则保留整个链接; - 非允许链接:内部是图片则仅保留图片标签,普通文本链接直接移除;
- 正则修饰符
si支持跨换行匹配,且不区分大小写,适配更多场景。
执行后将得到符合预期的结果,合法链接的</a>标签会被完整保留。
内容的提问来源于stack exchange,提问作者Redirect
相关产品推荐
相关产品推荐

