Php 是否有一个正则表达式从URI中剥离特定的查询变量?

Php 是否有一个正则表达式从URI中剥离特定的查询变量?,php,regex,xhtml,uri,Php,Regex,Xhtml,Uri,我有一堆HTML,它们是由使用C、XML和XSL的守护进程生成的。然后我有一个PHP脚本,它提取HTML标记并将其显示在屏幕上 我有大量与XHTML1兼容的标记。我需要修改标记中的所有链接以删除&;utm_来源=报告和;utm_medium=电子邮件和;utm_活动=报告 到目前为止,我考虑了两种选择 在PHP后端进行正则表达式搜索,以整理分析代码 编写一些Jquery来循环链接,然后从href中删除分析代码 障碍: HTML可以是巨大的。即超过4MB(运行了一些测试,平均约100Kb)

我有一堆HTML,它们是由使用C、XML和XSL的守护进程生成的。然后我有一个PHP脚本,它提取HTML标记并将其显示在屏幕上

我有大量与XHTML1兼容的标记。我需要修改标记中的所有链接以删除
&;utm_来源=报告和;utm_medium=电子邮件和;utm_活动=报告

到目前为止,我考虑了两种选择

  • 在PHP后端进行正则表达式搜索,以整理分析代码
  • 编写一些Jquery来循环链接,然后从href中删除分析代码
  • 障碍:

  • HTML可以是巨大的。即超过4MB(运行了一些测试,平均约100Kb)
  • 一定要快,我们大约有3公里 想法

  • 现在我正在尝试使用
    str_replace('&;utm_source=report&;utm_medium=email&;utm_campaign=report',''$html)但它不起作用。

    对于这么大的HTML块,我会将其分配给外部进程,可能是一个perl脚本

    我不是很肯定,因为我从来没有尝试过解析如此多的文本,但我愿意承认PHP不会很快做到这一点


    你的预期负荷是多少?您需要多久做一次这种处理?这听起来像是一个批处理操作,我承认我对这类任务的经验有限,它不需要非常快,但速度足够快,可以在合理的时间内执行(也就是说,你不会在一夜之间等它或其他什么)

    不是真正的RegExp,但它可能会帮助你(未经测试):

    $xmlPrologue='';
    $source=“…”;//你是生意人
    $dom=新的DOMDocument($source);
    $dom->loadXML($source);
    $links=$dom->getElementsByTagName('a');
    foreach($links作为$link){
    list($base,$queryString)=分解('?',$link->getAttribute('href');
    //读取数组中的GET参数
    parse_str(,$queryString/*通过引用赋值*/);
    //摆脱不需要的获取参数
    未设置($queryString['utm_source']);
    未设置($queryString['utm_medium']);
    取消设置($queryString['utm_email']);
    未设置($queryString['utm_report']);
    //重新组合查询字符串
    $queryString=http_build_query($queryString,null,&;');
    //或者(不确定哪一个是最好的)
    $queryString=http_build_query($queryString,null,&');
    //分配新清理的href属性
    $link->setAttribute('href',$base'?'。$queryString);
    }
    $html=$dom->saveXML();
    //去掉XML声明。使IE处于怪癖模式
    $html=substr_replace($html,,,0,strlen($xmlPrologue));
    $html=trim($html);
    echo$html;
    
    正则表达式是一种方法。或者,您可以使用XPath查找文档中的所有链接,然后处理循环中的每个链接。因为这是一个XHTML文档,如果假设它是格式良好的,那么这种方法似乎是合理的。

    如果字符串总是相同的,那么最快的php函数I;我发现这是strtrtr


    显然,您需要对速度进行基准测试,但这应该在那里。

    PHP的
    preg\u replace\u all()
    如果您在后端以CGI模式运行它,它将非常快地完成此任务。为什么有时不使用cronjob运行php脚本来处理所有的HTMLs呢?因此,前端php脚本只会将处理后的内容放入浏览器,而不进行任何计算。

    您可以使用
    sed
    或其他低级工具删除这些部分:

    find /path/to/dir -type f -name '*.html' -exec sed -i 's/&utm_source=report&utm_medium=email&utm_campaign=report//g' {} \;
    

    但这将在任何地方删除此字符串,而不仅仅是在URL中。所以要小心。

    我最终推迟使用str_replace并在整个文档内容中替换字符串:(.

    几年前我遇到了这个问题,并提出了以下正则表达式来替换URL中这些utm变量的任何实例:

    /(\?|\&)?utm_[a-z]+=[^\&]+/
    
    用法示例:

    preg_replace('/(\?|\&)?utm_[a-z]+=[^\&]+/', '', 'http://mashable.com/2010/12/14/android-quick-start-guide/?utm_source=twitterfeed&utm_medium=twitter&utm_campaign=Feed%3A+Mashable+%28Mashable%29');
    

    我在博客中介绍了这一体验

    Wow!我希望看到该服务器上的进程列表,具有20M DOMs解析功能…这种方式很好,但不适用于大型文件,因为DOM扩展占用了大量内存。老实说,我从未在20MB HTML上尝试过它,但我也希望看到进程列表。PHP有时非常慢。这种方法似乎更容易实现o、 不要使用正则表达式。使用原始字符串替换。我怀疑&utm_source=report&utm_medium=email&utm_campaign=report会出现在链接之外,所以使用正则表达式可能不是您想要的。我想知道20MB的HTML中会有什么内容……为什么不能更改守护程序C/Xml/XSL代码而不生成“&utm\u来源=报告&utm\u媒体=电子邮件&utm\u活动=报告"首先,没有代码比没有代码快。我不能更改守护进程。我想在为web生成此代码时使用单独的XSL样式表,而不是电子邮件,但这在现在是不可行的。我会对原始数据进行第二次修复,而不是在服务器或cl中修改它客户端。这会覆盖初始文件吗?我不想覆盖初始文件。是的,会覆盖(请参见
    -I
    )。如果您不想这样做,请设置
    -i.backup
    ,您将得到一个
    *文件名*.backup
    。但是,在将它应用于所有文件之前,请先在一些测试文件上尝试它。
    strtr
    只替换某些字符。请改用
    stru replace
    。strstrstr的问题是它只是字符串的第一次出现。@Gumbo他要求速度,strtr比str_replace快得多@Zachary Spencer strtr不是strstrstr,整个strtr都是strtr给我的问题。以下是strtr给我的示例输出:没有acmivimy mo reporm!如果yoa不熟悉mhis,我会付钱给你一个指示,mham Zachary正在使用str_replace,这是有效的…现在。最终我想转移到它自己的XSL文件。不管
    strtr
    的速度有多快都不重要
    /(\?|\&)?utm_[a-z]+=[^\&]+/
    
    preg_replace('/(\?|\&)?utm_[a-z]+=[^\&]+/', '', 'http://mashable.com/2010/12/14/android-quick-start-guide/?utm_source=twitterfeed&utm_medium=twitter&utm_campaign=Feed%3A+Mashable+%28Mashable%29');