0

我正在编写一个时事通讯应用程序,我需要使可能出现在客户时事通讯中的用户定义链接发生变化,以便检测到的链接像

<a href="http://whateverclientsite.com/">blah</a>

变成

<a href="http://mysite.com/redirect.php?utm_source=Emails&utm_medium=MyNewsletterSubject&utm_campaign=MyNewsletterCampaign&eid=123123&mailid=234234&url=http://whateverclientsite.com/>blah</a>

我的redirect.php 将是一个带有一些谷歌分析代码的页面,该代码将触发(因此我可以跟踪新闻通讯生成的链接点击次数),然后将自身重定向到用户定义的url http://whateverclientsite.com

我必须在 php 中而不是在客户端 javascript 中重写此链接,因为必须在发送时事通讯之前完成更改。

我在这里寻找的是进行 url 重写的代码,我已经在使用的谷歌东西。应该是一个相当简单的正则表达式操作,但我的正则表达式技能很烂。

如果我在任何答案出现之前让它工作,我会回帖。

PS:我还需要清除某些 url 和图像标签,以免它们被重写。例如,不应重写任何指向 mysite.com 的链接。

PS 整个时事通讯在我必须处理它时以 php 字符串的形式存在。我
$newsletter = rewriteurls($newsletter, $url_exceptions_array);
正在考虑的函数调用也是如此 - 所以我的问题是,我应该如何定义 rewriteurls()?

4

1 回答 1

1

URL 形成规则非常复杂(rfc)。而且html属性也很复杂。但是,如果您不介意在召回方面进行权衡,那么您可以:

$new_url = preg_replace(
    '@href=(?:\'|")?(?P<url>[\w?&=+/%#.:-]*)(?:\'|")?@i', 
    'href="redirect.php?u=$1"', # replace this with desired wrapper
    $your_feed);

此功能在以下情况下失败:错误的方案(如abbbc://this.is.invalid.url)、错误的标签(<link href=...)、空格(href =),但您不太可能遇到这些情况。如果你这样做了,改进这个正则表达式来覆盖缺失的东西。

让我们看看这个正则表达式是由什么组成的(下面是不可用的)。

@ <-- delimiter
  href=(?:\'|")? <-- href=' or href=" or href=
  (?P<url> <-- capturing part
    [\w?&=+/%#.:-]* <-- a-zA-Z0-9_?/=+%#.:-& from zero to infinity times
  )
  (?:\'|")? <-- close href value
@i <-- delimiter, case insensetive modifier. HREF will work too
于 2012-06-20T18:18:01.413 回答