“以”开头、“不包含”和“以”结尾的正则表达式

时间:2021-05-16 01:53:26

标签: regex wordpress multiple-conditions facebook-pixel

我正在尝试在 WordPress 网站中搜索代码,特别是针对 facebook 像素。我正在使用正则表达式搜索字符串,我知道字符串以什么开头、以什么结尾以及字符串不应该包含什么。我在 SO 上尝试了其他解决方案,但没有运气。

字符串应该以:

开头 <块引用>

fbq('track'

结尾:

<块引用>

);

且不包含:

<块引用>

页面视图

我一直在尝试进行此搜索的表达式是:

^(?=^fbq('track')(?=.*\);$)(?=^(?:(?!PageView).)*$).*$/

来自另一个 StackOverflow 问题: Combine Regexp?

但是,我一直回复说这是一种无效的格式。

3 个答案:

答案 0 :(得分:1)

您可以使用:

^(?!.*PageView)fbq\('track.*\);$

或者:

^fbq\('track(?!.*PageView).*\);$

Demo.

细分:

  • ^ - 字符串的开头。
  • (?!.*PageView) - 否定前瞻(从现在开始不包含“PageView”)。
  • fbq\('track - 匹配 "fbq('track",字面意思(注意 "(" 是如何转义的:\()。
  • .* - 匹配零个或多个字符(任何字符)。
  • \); - 匹配 ");"从字面上看。
  • $ - 字符串结束。

答案 1 :(得分:0)

你可以选择第一个! 我已经在正则表达式软件中测试了它,当我需要时我用来尝试“正则表达式”。 ;)

我要添加一点点沙子:)

这里有一个很好的资源来阅读环视后视(以及否定后视等):https://www.regular-expressions.info/lookaround.html< /p>

*它包含有关最常用的正则表达式风格的使用和限制的信息(以及它在某些编程语言中的实现)。

答案 2 :(得分:0)

首先,如果您无法找到 FB Pixel,请检查您的网站上是否有 Google Tag Manager,也许它是通过 GTM 添加的,

如果没有,那么使用 RegEx...

由于这是模板文件中的脚本,它可以跨越多行并在文本前有空格等,因此更灵活的模式是合适的。

所以主要思想是不要在模式中使用 ^ 和 $。

Example

fbq\('track'(?!.*?PageView)[^)]*\);

上述模式满足您在 OP 中概述的要求,其中

  • fbq\('track' - 字面上匹配 fbq('track' 作为字符串的开头
  • (?!.*?PageView) - 如果找到 PageView,则否定前瞻失败,.*?用于延迟匹配 0 个或多个字符,因为我们迟早会找到 PageView 并且不需要回溯
  • 由于上面的前瞻是 0 长度,如果它通过(未找到 PageView)光标仍将位于 - fbq('track' <- 光标在此处
  • [^)]* - 匹配 0 个或多个字符,直到找到将其排除在外的右括号
  • \); - 匹配 );从字面上看。

我猜你可能在使用 VSCode、PhpStorm 或类似的,所以为了兼容性,我在示例中选择了 JS 作为风格。

如果您在 Linux 上使用 grep say 或 Windows 上的 bash 终端(由于 grep 参数兼容性不确定 Mac),从 Theme 目录运行它应该会显示文件和匹配项。

grep -Pzro 'fbq\('\''track'\''(?!.*?PageView)[^)]*\);'