正则表达式将GET参数添加到网址

时间:2016-02-19 06:26:27

标签: php regex

我想将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

请帮帮我。

2 个答案:

答案 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}';
}

理想情况下,您应该提取网址并对其进行解析,但此解决方案应该有效。