PHP使用preg_replace替换已知字符串间的未知内容
PHP正则提取Google新闻跳转链接中的目标URL
问题分析
你需要处理Google新闻的跳转URL,提取其中&url=参数后的真实目标链接,还要应对字符串中可能存在的多个此类链接,避免贪婪匹配导致的过度替换。
解决方案
下面是修正后的PHP代码,结合正则转义、非贪婪匹配和捕获组完美实现你的需求:
// 你的原始单行字符串示例 $stringF = 'http://news.google.com/news/url?sa=t&fd=R&ct2=us&usg=AFQjCNHWQk0M4bZi9xYO4OY4ZiDqYVt2SA&clid=c3a7d30bb8a4878e06b80cf16b898331&cid=52779892300270&ei=H4IAW6CbK5WGhQH7s5SQAg&url=https://abcnews.go.com/Lifestyle/wireStory/latest-royal-wedding-thousands-streets-windsor-55280649'; // 执行正则替换提取目标URL $stringG = preg_replace( '~http://news\.google\.com/news/url\?sa=.*?&url=([^\s]+)~i', '$1', $stringF ); // 输出结果 echo $stringG;
正则表达式关键点拆解
~:用它作为正则分隔符,省去了对/的转义操作,让表达式更简洁易读http://news\.google\.com/news/url\?:特意转义了.和?——这俩是正则元字符,必须加\才能匹配它们的字面含义sa=.*?:.*?是非贪婪匹配模式,会精准匹配sa=之后的内容直到第一个&url=出现,绝对不会过度匹配到其他链接&url=([^\s]+):括号是捕获组,专门提取&url=后面的目标URL;[^\s]+匹配所有非空白字符,确保只捕获当前链接的内容,不会跨到下一个链接i:可选的大小写忽略修饰符,如果你的链接可能存在大小写差异可以加上
你的原始代码问题在哪?
- 通配符用错了:正则里的
*是量词(表示前面字符出现0次或多次),不是通配符,你需要用.*(贪婪匹配任意字符)或.*?(非贪婪版本) - 没转义元字符:
?、.这些字符在正则中有特殊功能,必须加\转义才能匹配它们本身 - 缺少非贪婪控制:不用
.*?的话,贪婪的.*会直接匹配到字符串最后一个&url=,导致替换出错 - 替换逻辑不对:你原来想替换成
http,但实际上应该保留&url=后面的完整链接,用捕获组$1引用提取到的内容才是正确思路
内容的提问来源于stack exchange,提问作者Brandon Wolgast
相关产品推荐
相关产品推荐

