【问题标题】:Reverse String Using Regexes使用正则表达式反转字符串
【发布时间】:2011-01-19 17:53:33
【问题描述】:

如果我有一个像<start_delim>asdf<end_delim> 这样的字符串,并且我想在分隔符之间取一个字母数字字符串并使用正则表达式反转它,我将如何去做?

我的本​​能是使用 preg_replace("<start_delim>([a-zA-Z0-9]+)<end_delim>", strrev($1), $str) 之类的东西,但由于显而易见的原因,这不起作用。

【问题讨论】:

    标签: php regex string reverse


    【解决方案1】:

    你必须使用preg_replace_callback

    $str = "<start_delim>asdf<end_delim>";
    function my_callback($m) {
      return $m[1].strrev($m[2]).$m[3];
    }
    echo preg_replace_callback("/(<start_delim>)([a-zA-Z0-9]+)(<end_delim>)/", 'my_callback' , $str);
    

    http://codepad.org/xP2arFZk

    【讨论】:

    • @nikic 你说得太早了...stackoverflow.com/questions/4738798/…
    • @Daniel:嗯 :( 不应该提到它...@rubber boots:慢,可能不安全。
    • 不知道这个回调的事情;这也应该使其他代码更容易。谢谢!
    【解决方案2】:

    类似于以前的解决方案,但使用 lambda:

    $str = "<start_delim>asdf<end_delim>";
    $result = preg_replace_callback('/<start_delim>([a-zA-Z0-9]+)<end_delim>/', function($matches) {
            return strrev($matches[1]);
    }, $str);
    
    echo "$result\n";
    

    【讨论】:

      【解决方案3】:

      有人在评论中指出最好不要使用 /e 修饰符,但是 如果可能的话,那会奏效。几乎和你想的一样:

      echo preg_replace('|<start_delim>([^<^]+)<end_delim>|e', 'strrev("$1")', $str);
      

      问候

      rbo

      【讨论】:

      • 它可以工作,但它有潜在的危险和缓慢 - 就像eval()
      • @Alix Axel:你必须权衡它(这是潜在的危险)以防止代码混乱和失去简单性。恕我直言,在某些领域它是有用的,而在其他领域则不是。问候,rbo
      • 动态评估代码并不简单,至少对我而言。
      • 此代码易受攻击:尝试使用$str='&lt;start_delim&gt;${${phpinfo()}}&lt;end_delim&gt;'; 运行它。不得在 eval 字符串中使用双引号字符串。 “e”修饰符之所以危险,是因为大多数人不会注意到这一点。
      猜你喜欢
      • 1970-01-01
      • 2010-09-21
      相关资源
      最近更新 更多