我正在尝试检查网页是否存在Google Analytics(分析)脚本标记。这似乎很容易,但是我的正则表达式技能似乎不足。因此,作为一个简单的示例,我试图匹配打开和关闭脚本标签,它们之间具有“ google-analytics”。
因此,例如,如果您有:
<script scr="whatever"></script>
<script>other script</script>
blah blah blah
<script>
blah blah google-analytics
<script>
然后正则表达式:
/<script>([s/S/]*?google-analtics[s/S/]*?)<\/script>/
这将返回从第一个脚本标签开始的字符串,并包括其他脚本标签。所以像这样:
other script</script> blah blah blah <script> blah blah google-analytics
但是我当然只想要字符串
blah blah google-analytics
因此,下一步就是要像下面这样包含负面印象:
/<script>((?![s/S/]*?script)[s/S/]*?google-analytics[s/S/]*?)<\/script>/
但这似乎不起作用。我尝试了捕获组和“ [s / S /] *?”的不同组合在前面和后面。
基本上,我正在尝试匹配不包含子字符串的字符串。这听起来像是一个普遍的问题,但对于我的一生,我无法上班。我有大量的谷歌和所有的例子很简单,但似乎没有用。我一直在使用https://regex101.com/r/hN5dK5/2进行测试
任何见解都会有所帮助。 (脚本以php运行)
参考方案
正则表达式方法
首先,使用verbose
模式具有更好的可读性。
然后考虑以下正则表达式:
<script> # match "<script>" literally
(?:(?!</script>)[\s\S])* # match anything except "</script>"
(?:google-analytics) # look for "google-analytics" literally
(?:(?!</script>)[\s\S])* # same pattern as above
</script> # closing "</script>" tag
在your updated demo中查看有关此方法的演示。
解析器方法
SimpleXML
通常,使用正则表达式分析HTML
被认为是对SO
的不当做法(请参见this famous post),因此您最好使用带有解析器和适当的xpath
查询的方法:
$xml = simplexml_load_string($html);
$scripts = $xml->xpath("//script[contains(text(),'google-analytics')]");
print_r($scripts);
参见demo on ideone.com。
DOMDocument
有人可能会争辩说,SimpleXML
并非真正用于解析HTML
文件(顾名思义,实际上是XML
文件),因此为了完整起见,最后以DOMDocument
为例:
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXpath($doc);
$scripts = $xpath->query("//script[contains(text(),'google-analytics')]");
foreach ($scripts as $script) {
// do sth. useful here
print_r($script);
}
php Singleton类实例将在多个会话中保留吗? - php举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…
PHP-将日期插入日期时间字段 - php我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数
PHP getallheaders替代 - php我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…
PHP mysqli获取查询返回的第一行的值 - php我正在使用mysqli从数据库中获取某些数据。我正在使用的查询已设置为仅从数据库返回一行。有没有一种方法可以在不使用while循环的情况下获取该行的值?我知道一个while循环对于返回多于一行的行很有用,但是如果不需要while循环,我想避免这种情况,因为不必要的代码是不好的编程。 参考方案 是的-您可以使用:$row = $result->fetch…
更改默认的URL PHP - php如何更改默认网址。例如www.example.com/index.php-> www.example.com现在,我要将其设置为www.example.com/test.php。我应该在php.ini中进行更改吗? 参考方案 假设您正在使用apache,则可以通过DirectoryIndex指令执行此操作。Check out the docs。