【问题标题】:Php regular expression for preg_replace to remove a secific textpreg_replace 的 php 正则表达式删除特定文本
【发布时间】:2012-10-28 17:22:04
【问题描述】:

我正在尝试从我的 JS 函数数组中删除一个 JS 函数,但我找不到正确的正则表达式。

这是我要删除的文本(函数):

window.addEvent('domready', function() {

  SqueezeBox.initialize({});
  SqueezeBox.assign($$('a.modal'), {
    parse: 'rel'
  });
});

我写了这段代码来删除它:

<?php if (isset($this->functions['text/javascript'])) {
      $this->functions['text/javascript'] = preg_replace('%window\.addEvent\(\'domready\',\s*function\\(\\)\s*\\{SqueezeBox\\.initialize\\(\\{\\}\\);\s*SqueezeBox\\.assign\\(\\$\\$\\(\'a\\.modal\'\\), \\{parse: \'rel\'\\}\\);\\}\\);\s*%', '', $this->functions['text/javascript']);
      if(empty($this->functions['text/javascript'])) {
          unset($this->functions['text/javascript']);
      }
  } ?>

我的正则表达式不太好,所以我迷路了,不知道在哪里寻找模式中的错误。

【问题讨论】:

  • 你应该更稀疏地匹配它。使用 .*? 并在其中查找 SqueezeBox 而不是断言整个函数体。例如,您在 parse: 之前忘记了 \s*。可能需要更多这些。 (不过,在逃跑方面做得很好。)
  • 如果您删除 preg_replace 并只给出 "" 怎么办? - 对不起,我的问题很可悲。
  • 一个问题是,如果您希望 * 匹配换行符,则需要使用 s (PCRE_DOTALL) flag
  • @EliasVanOotegem 我想你的意思是sm (PCRE_MULTILINE) 标志仅更改 ^ 行首和 $ 行尾元字符的行为。请参阅我之前评论中的链接:“如果在模式中……没有出现 ^$,则设置此修饰符无效。”
  • @user113215:是的,我的意思是 s 标志,评论已删除

标签: php regex arrays


【解决方案1】:

正则表达式不太适合解决此类问题。我建议从 php 中输出某种标志变量并将其用作 js 中的条件,如下所示:

window.addEvent('domready', function() {
if(flag){
  SqueezeBox.initialize({});
  SqueezeBox.assign($$('a.modal'), {
    parse: 'rel'
  });
}
});

然后,您可以在 php 中输出 var flag=truevar flag = false,具体取决于您的逻辑。

【讨论】:

  • 如果您对页面有这种控制(将 JavaScript 注入页面的能力),您应该只在需要时使用 PHP 注入脚本本身,而不是输出 JavaScript 标志。
  • 我怀疑其中包含一个 js 文件,在这种情况下,您无法选择选择性地输出其中的一部分。
  • 谢谢这是个好主意,但@Asad 是对的,我没有选择性输出的选项。
【解决方案2】:

我终于成功了。感谢大家的帮助!

这是对我有用的最终代码。

<?php 
  if (isset($this->functions['text/javascript'])) {
      $this->functions['text/javascript'] = preg_replace('%window\.addEvent\(\'domready\',\s*function\(\)\s*{\s*SqueezeBox.initialize\(\{\}\)\;\s*SqueezeBox.assign\(\$\$\(\'a.modal\'\)\,\s*{\s*parse:\s*\'rel\'\s*}\);\s*}\);\s*%', '', $this->functions['text/javascript']);
      if(empty($this->functions['text/javascript'])) {
          unset($this->functions['text/javascript']);
      }
  } 
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-20
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多