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

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:可选的大小写忽略修饰符,如果你的链接可能存在大小写差异可以加上

你的原始代码问题在哪?

  1. 通配符用错了:正则里的*是量词(表示前面字符出现0次或多次),不是通配符,你需要用.*(贪婪匹配任意字符)或.*?(非贪婪版本)
  2. 没转义元字符:?、.这些字符在正则中有特殊功能,必须加\转义才能匹配它们本身
  3. 缺少非贪婪控制:不用.*?的话,贪婪的.*会直接匹配到字符串最后一个&url=,导致替换出错
  4. 替换逻辑不对:你原来想替换成http,但实际上应该保留&url=后面的完整链接,用捕获组$1引用提取到的内容才是正确思路

内容的提问来源于stack exchange,提问作者Brandon Wolgast

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:07:40