PHP Regex匹配标记前瞻问题 - php

我正在尝试检查网页是否存在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。