【问题标题】:Improving speed of regex and using preg_replace for slugs提高正则表达式的速度并将 preg_replace 用于 slug
【发布时间】:2013-06-15 08:40:16
【问题描述】:

以前我一直在回显 $obj->html,但当前的项目要求检查 HTML 中是否存在 {whatever} 之类的 slug,并将其替换为其他内容。

我有两个问题。首先是这段代码比我想要的要慢:

class Foo {

  function draw_content() {
    $slug = "/(?<=\{).*(?=\})/";
    if (preg_match($slug, $this->html, $matches)) {
        foreach ($matches as $match) {
            if (method_exists($this,$match))    {
                $replacement = $this->$match();
                $this->html = preg_replace("/\{$match\}/", $replacement, $this->html);
            }
        }
    } 
    return $this->html;
 } // fn

  function new_releases() {
    echo "new release book covers"; 
  }  // fn

} // class

有没有更好的方法来获取 slug 内容?我想正则表达式是什么减慢了速度?

第二个问题对我来说很陌生。鉴于此 $obj->html:

<p class="headline">New Releases</p>
<p>xxx{new_releases}xxxx</p>

$obj->draw_content() 处理后的输出由&lt;?=$obj-&gt;draw_content()?&gt;绘制

new release book covers<p class="headline">New Releases</p>
<p>xxxxxxx</p>

为什么要在前面加上 new_releases() 输出?蛞蝓不见了,但替代品不在它的位置!

【问题讨论】:

    标签: php regex slug


    【解决方案1】:

    您可以通过以下方式替换您的模式:

    $slug = '~{\K[^}]*+(?=})~';
    

    恕我直言,您应该用唯一的preg_replace_callback 函数替换您的preg_match 测试和preg_replace,尝试这样的事情(并纠正错误:)。

    function draw_content() {
        $slug = '~{([^}]*+)}~';
        $that = $this;
        $this->html = preg_replace_callback( $slug, function ($m) use ($that) {
            if (method_exists($that, $m[1]))
                return $that->$m[1]();
            return $m[0]; }, $this->html);
        return $this->html;
    }
    

    【讨论】:

    • 哇,速度快了很多!谢谢!对奇怪的 preg_replace() 行为有什么看法?
    • 你摇滚!!我对preg_replace_callback() 文档摸不着头脑。这绝对解决了我的问题!
    • @jerrygarciuh:为你高兴。
    • Sooo 我还有一个问题——服务器运行的是 PHP 5.3.13;文档说 $this 在匿名函数中不可用,直到 5.4 php.net/manual/en/functions.anonymous.php 我用命名函数替换吗?我尝试制作一个全局并将 $this 克隆到其中,但没有骰子;不适用于匿名函数。
    • 现在我欠你很多啤酒!你极大地改善了我的一天!
    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 2011-05-20
    • 2016-07-11
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多