【问题标题】:url parameters regexurl 参数正则表达式
【发布时间】:2011-08-06 08:22:34
【问题描述】:

我创建了自己的时事通讯模块,但遇到了一个(大)问题。 系统使用附加参数格式化所有网址,以跟踪谷歌分析中的点击。

例如 像这样的网址

http://www.domain.com

变成这样

http://www.domain.com/&utm_source=newsletter&utm_medium=e-mail&utm_campaign=test

还有这样的网址

http://www.domain.com/?page=1

变成这样

http://www.domain.com/?page=1&utm_source=newsletter&utm_medium=e-mail&utm_campaign=test

第一个例子是假的。我知道第一个&符号必须用&符号替换,这就是问题发生的地方。 我正在使用这种模式来提取 url 的

$pattern = array('#[a-zA-Z]+://([-]*[.]?[a-zA-Z0-9_/-?&%\{\}])*#');
$replace = array('\\0&utm_source=newsletter&utm_medium=e-mail&utm_campaign=test');
$body = preg_replace($pattern,$replace,$body);

谁能帮助我正确且有效的正则表达式,所以第一个 url 参数总是包含一个问号而不是一个&符号?

【问题讨论】:

  • 你为什么不想使用strpos + 连接?
  • 如果一个答案解决了您的问题,您应该通过在其下方标记绿色 V 来接受它作为一个好的答案。

标签: php regex


【解决方案1】:

随便用

if(strpos($string,'?') !== false)
//add with ampersand
else
//add with question mark

【讨论】:

    【解决方案2】:

    不是正则表达式,但它会工作。它所做的只是检查一个 ?如果没有找到,请将第一个 & 更改为问号。:

    $url = (substr_count($url, '?')>0) ? $url : str_replace('&', '?', $url, 1);
    

    【讨论】:

      【解决方案3】:

      一种非常简单的方法是查找类似http://...& 的字符串,其中... 不包含? 问号或其他分隔符:

      = preg_replace('#(http://[^\s"\'<>?&]+)&#', '$1?', $src);
      

      但最好使用受限字符类而不是否定字符类:

      $src = preg_replace('#(http://[\w/.]+)&#', '$1?', $src);
      

      【讨论】:

        【解决方案4】:

        此解决方案修复了所有查询以 &amp; 开头的网址(并且缺少 ?):

        $re = '%([a-zA-Z]+://[^?&\s]+)&(utm_source=newsletter)%';
        $body = preg_replace($re, '$1?$2', $body);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-28
          • 2012-02-21
          • 2012-11-30
          • 2016-07-23
          • 2017-12-01
          • 2011-07-20
          • 1970-01-01
          相关资源
          最近更新 更多