我想将GET参数添加到特殊字符串中的所有URL(例如网站的html内容)。
例如:
之前:
$content = '... <a href="http://foo.bar/register.php">register </a> ... <a href="http://foo.bar/login.php?t=1">login</a> ...';
之后:
$content = '... <a href="http://foo.bar/register.php?wid=${wid}">register </a> ... <a href="http://foo.bar/login.php?t=1&wid=${wid}">login</a> ...';
我认为这只能用正则表达式完成,因此我编写了这个函数:
function makeLinks($str)
{
$str = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '$1?wid=${wid}', $str);
return $str;
}
但这种模式有问题!例如:
http://google.com?foo=bar => http://google.com?wid=${wid}?foo=bar
请帮帮我。
答案 0 :(得分:0)
我认为可能会有一个简短的方法。我的解决方案:
function makeLinks($str) {
preg_match_all('|(https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*))|', $str, $urls);
if ($urls && isset($urls[1])) {
foreach ($urls[1] as $url) {
$new_url = $url . (strpos($url, '?') ? '&' : '?') . 'wid=${wid}';
$str = str_replace($url, $new_url, $str);
}
}
return $str;
}
答案 1 :(得分:0)
试试这个:
function makeLinks($str)
{
$str = preg_replace_callback('/\b((?:https?|ftp):\/\/(?:[-A-Z0-9.]+)(?:\/[-A-Z0-9+&@#\/%=~_|!:,.;]*)?)(?:\?([A-Z0-9+&@#\/%=~_|!:,.;]*))?/i', 'modify_url', $str);
return $str;
}
function modify_url($matches) {
$query = isset($matches[2]) ? $matches[2]:'';
$result = $matches[1].'?'.$query;
if(!empty($query)) $result .= '&';
return $result.'wid=${wid}';
}
您可以选择添加@而不影响结果。我讨厌使用它们,但在这里它是为了你想要使用它们:
function modify_url($matches) {
$result = $matches[1].'?'.@$matches[2];
if(!@empty($matches[2])) $result .= '&';
return $result.'wid=${wid}';
}
理想情况下,您应该提取网址并对其进行解析,但此解决方案应该有效。