如何用Preg_Replace将字符串中所有URL编码为Base64?正则失效求助
如何用preg_replace对HTML中所有href的URL进行Base64编码?
我来帮你解决这个正则匹配+Base64编码的问题~首先看你的场景,核心是要把HTML字符串里所有<a>标签的href属性值转成Base64编码,但原有的正则不完整,也没覆盖到href的所有写法场景,下面给你完整的解决方案:
问题分析
你的原正则没写完,而且忽略了HTML里href的三种常见格式:
href="xxx"(双引号包裹)href='xxx'(单引号包裹)href=xxx(无引号)
另外,直接用preg_replace没法直接对匹配到的URL做编码操作,得用preg_replace_callback实现动态处理逻辑。
完整解决方案代码
$html = 'ahsgdjagshjdgasjdgajgsd gjagdjhagsjhgda sgdhjagsjdgajhgdjad<a href="http://short.awsubs.co/be9Vk">Solidfiles</a> jashd sha7st7atsdgasgda sgahsfd ahgsfafd<a href=https://link.safelinkconverter.com/review.php?id=aHR0cDovL2JfdC5seS8ySDdMajh3&c=1&user=61942 rel=nofollow>Zippyshare</a>'; // 使用回调函数处理每个匹配到的href $encodedHtml = preg_replace_callback( // 正则匹配href属性,兼容有/无引号的情况 '/href=(["']?)(https?:\/\/.*?)\1/i', function($matches) { // $matches[2]是捕获到的原始URL $encodedUrl = base64_encode($matches[2]); // 保留原有的引号格式,替换为编码后的URL return 'href=' . $matches[1] . $encodedUrl . $matches[1]; }, $html ); // 输出处理后的HTML echo $encodedHtml;
代码关键点解释
正则表达式:
/href=(["']?)(https?:\/\/.*?)\1/ihref=:匹配属性名,/i修饰符忽略大小写(兼容HREF的写法)(["']?):捕获可选的引号(双/单),作为分组1,同时处理有引号和无引号的情况(https?:\/\/.*?):捕获HTTP/HTTPS开头的URL,.*?是非贪婪匹配,避免误匹配到多个标签的内容\1:匹配分组1捕获的引号,保证URL的闭合逻辑(如果有引号的话)
回调函数:
- 每匹配到一个符合规则的
href,就会触发这个函数 - 对捕获到的原始URL(
$matches[2])执行base64_encode编码 - 最后拼接回原来的
href格式,保留原有的引号样式,保证HTML结构的正确性
- 每匹配到一个符合规则的
测试效果
运行这段代码后,原来的两个href值会被替换成Base64编码后的内容,比如第一个URL http://short.awsubs.co/be9Vk 会变成 aHR0cDovL3Nob3J0LmF3c3Vicy5jby9iZTlWawo=,第二个无引号的URL也能被正确编码。
内容的提问来源于stack exchange,提问作者Jazuly
相关产品推荐
相关产品推荐

