【问题标题】:Repeat elements in preg_replace()在 preg_replace() 中重复元素
【发布时间】:2015-03-01 22:06:44
【问题描述】:

我有字符串:{$value.level-1.level-2.level-3 ... level-n},我需要将其更改为{$value['level-1']['level-2']['level-3'] ... ['level-n']}

我现在只做一个:

preg_replace('(\{\$(.*?)\.(.*?)\})', '{$$1[\'$2\']}', $string); 但是我怎样才能在所有级别上重复它呢?

【问题讨论】:

    标签: php regex replace preg-replace


    【解决方案1】:

    您不需要正则表达式。对于您正在尝试做的事情,它是不必要的复杂、难以阅读和难以维护。只需改用str_replace

    $leadinString = '$value'; // or '$test' or 'foobar' or whatever
    $str = '{$value.level-1.level-2.level-3 ... level-n}';
    echo str_replace(array("$leadinString.", '}', '.'), array($leadinString . "['", "']", "']['"), $str);
    

    Demo

    注意:我根据您的评论编辑了此内容。

    【讨论】:

    • $value 仅用于问题名称,它可以是 $test 或 $user - 所以我需要用户 preg_replace
    • 您的问题并不清楚,但这是非常重要的一点。也就是说,您仍然可以使用str_replace。请参阅上面的编辑。
    【解决方案2】:

    试试这个:

    preg_replace('#\.([a-zA-Z0-9_-]+)#', '[\'$1\']', $string)
    

    【讨论】:

    • 这个正则表达式替换从点到文件结尾的所有内容
    • 不知道你为什么包含下划线,无论如何都很好的答案+1。
    • @l'L'l 因为它可能是属性名称的一部分。正则表达式的哲学说您的模式需要尽可能灵活。如果它在一种情况下有效,则不会说在另一种情况下有效。我看到已经选择了带有 str_replace 的解决方案,这是一个非常糟糕的主意。
    猜你喜欢
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多