【问题标题】:ereg to preg problems [duplicate]ereg到preg问题[重复]
【发布时间】:2011-09-23 04:39:45
【问题描述】:

我正在使用下载的 PHP 脚本来加速我的网站的开发,但我收到了一堆与 ereg 相关的“已弃用”消息。我将在上线前关闭警告,但我会尽量确保我先清除它们!

我找到了一个handy guide,它适用于简单的位,例如使用 / 和 /i 更改 preg_replace 的 eregi_replace,但我遇到了一些更高级的表达式(使用 cmets、串联、变量、大括号等等 - 有些是相同的类型,但我很困惑尝试和打破它!)。

当我更新以下内容时,谁能告诉我应该将 / 或 / /i 放在哪里,或者,同样欢迎,告诉我如何处理每种类型(或指向我的说明),以便我自己做?

eregi("<!--\ startBlock\(([^)]+)\)\ -->", $content["body"], $m)

eregi($reg, $content["body"], $m)

eregi("([^\.]+)\.(.*)", $variable, $m)  ... I think (?) this is preg_replace("/([^\.]+)\.(.*)/i", $variable, $m)

eregi("{url:([^}]+)}", $txt, $m))

eregi_replace("{".$key."}", $val, $txt)

eregi_replace("{script}", $HTTP_SERVER_VARS["SCRIPT_NAME"], $txt)

eregi_replace("{ifNotSet:".$m[1].":([^}]+)}", "", $txt)

更新: 我似乎一切正常(感谢您的帮助),除了下面的一个功能,我无法弄清楚 preg 版本 - 我尝试了各种组合,但生成的页面从未给出与 eregi 版本相同的结果(使用错误行)。有什么建议吗?

function parse(&$content) {
while (preg_match("/<!--\ startBlock\(([^)]+)\)\ -->/i", $content["body"], $m)) {
  $name = $m[1];
  $block = array();
  $block["name"] = $name;
  $block["blocks"] = array();
  $block["used"] = 0;
  $block["values"] = array();
  $reg = "<!--\ startBlock\(".$name."\)\ -->(.*)<!--\ endBlock\(".$name."\)\ -->";
  if (!eregi("$reg", $content["body"], $m)) {
$this->error("block `".$name."' does not have startBlock() AND endBlock().");
  }
  $block["body"] = $m[1];
  $content["body"] = eregi_replace("$reg", "{".$name."}", $content["body"]);
  $content["blocks"][$name] = array();
  $this->parse(&$block);
  $content["blocks"][$name][0] = $block;
}
}

然后我将开始“调用时传递引用”,这似乎更棘手!

【问题讨论】:

    标签: php regex preg-replace ereg


    【解决方案1】:

    // 只是边框字符,您实际上可以使用几乎任何您想要的字符,只要它们不在正则表达式的其他地方出现。 /i 表示不区分大小写,这意味着模式将计算大写或小写。

    要记住的重要一点是,如果你把 \ 放在一个字符前面,它会转义它,而不是将它视为特殊字符。

    【讨论】:

      【解决方案2】:

      我假设/ 是指开始和结束模式的分隔符?把它们想象成字符串周围的双引号。它们需要在模式的开头和结尾,并且模式中的任何/都需要转义\/,你可以在最后加上修饰符,比如i,它表示它会检查模式大小写-不敏感。所以/pattern/i 将检查模式(不区分大小写),并将&lt;/a&gt; 翻译成preg,它会类似于/&lt;\/a&gt;/(如果你愿意,你可以在后面加上i)。

      你可以把反斜杠改成别的东西(比如@符号,或者别的什么东西),但现在,我只想用它们来保持简单。可能还需要其他修改,但这似乎是一个大修改。

      【讨论】:

      • 这是否意味着eregi("{url:([^}]+)}", $txt, $m)) 应该变成preg_match("/{url:([^}]+)/i}", $txt, $m))?我如何处理像eregi_replace("{".$key."}", $val, $txt) 这样的模式被分成引用部分、变量和引用部分的部分?我需要将分隔符放在第一个引号的开头和最后一个引号的结尾,还是每个位都需要分隔符?
      • 所以只需添加/ 并在末尾添加一个 i。所以第一个会变成:/{url:([^}]+)}/i,第二个会变成"/{".$key."}/i"。我假设您实际上是在寻找{ },否则就不需要它们。
      • 您能否将其作为编辑发布在您的答案中,使其更易于阅读
      猜你喜欢
      • 2011-03-05
      • 2010-11-24
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      相关资源
      最近更新 更多