PHP如何从字符串中拆分提取url参数对应的目标链接
PHP提取URL中嵌套的url参数值方案
场景说明
你当前遇到的是URL参数未编码导致的解析问题:原始URL中url参数的值本身包含&符号,直接用parse_str或$_GET解析时会把值里的&识别为新参数的分隔符,无法拿到完整的目标URL。
下面提供两种对应场景的实现方案:
方案1:url参数在查询串首位时使用(最简便)
如果你的url参数固定在?后面第一个位置,直接截取url=之后的全部内容即可:
// 你的原始URL $rawUrl = 'https://example.in?url=https://test.in/admin/qrcode.php?s=qr&d=sps_dev_chanel_3&sf=8&ms=r&md=0.8&format=text'; // 提取?后面的查询字符串部分 $queryStr = parse_url($rawUrl, PHP_URL_QUERY); $targetUrl = ''; // 判断查询串是否以url=开头 if (strpos($queryStr, 'url=') === 0) { // 截取url=后面的所有内容,就是完整的目标URL $targetUrl = substr($queryStr, 4); } // 输出验证 echo $targetUrl;
方案2:通用兼容方案(url参数位置不固定也可用)
如果url参数可能出现在查询串的任意位置,用正则匹配提取:
$rawUrl = 'https://example.in?url=https://test.in/admin/qrcode.php?s=qr&d=sps_dev_chanel_3&sf=8&ms=r&md=0.8&format=text'; // 正则匹配url参数的完整值 preg_match('/[?&]url=(.+?)(?=&[^=&]+=|$)/', $rawUrl, $matches); $targetUrl = $matches[1] ?? ''; echo $targetUrl;
标准场景处理(参数已编码的情况)
如果后续生成这类带嵌套URL的参数时,建议先对嵌套URL做urlencode编码,这种情况下可以直接用PHP原生方法解析,不需要额外处理:
// 编码后的原始URL示例:https://example.in?url=https%3A%2F%2Ftest.in%2Fadmin%2Fqrcode.php%3Fs%3Dqr%26d%3Dsps_dev_chanel_3%26sf%3D8%26ms%3Dr%26md%3D0.8%26format%3Dtext $rawUrl = '编码后的URL'; $queryStr = parse_url($rawUrl, PHP_URL_QUERY); parse_str($queryStr, $params); $targetUrl = urldecode($params['url']);
内容的提问来源于stack exchange,提问作者Chinnu
相关产品推荐
相关产品推荐

