Php 是否有一个正则表达式从URI中剥离特定的查询变量?
我有一堆HTML,它们是由使用C、XML和XSL的守护进程生成的。然后我有一个PHP脚本,它提取HTML标记并将其显示在屏幕上 我有大量与XHTML1兼容的标记。我需要修改标记中的所有链接以删除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)
&;utm_来源=报告和;utm_medium=电子邮件和;utm_活动=报告
到目前为止,我考虑了两种选择
现在我正在尝试使用
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');