【问题标题】:preg_replace /e and arraypreg_replace /e 和数组
【发布时间】:2010-09-09 16:18:21
【问题描述】:

为什么这段代码不起作用?

$mx['foo'] = "vvv";
$string = "foo is foobar, baz is widgets";
echo preg_replace("/(foo)/ei",  "$mx[('\\1')]",  $string );

输出必须是这样的

vvv 是 vvvbar,baz 是小部件

【问题讨论】:

    标签: php arrays preg-replace


    【解决方案1】:

    因为您在preg_replace 中使用了双引号,PHP 会尝试直接使用您的$mx 值,这会产生错误...

    只需转义$mx,然后它就会工作:

    echo preg_replace("/(foo)/ei",  "\$mx[('\\1')]",  $string );
    

    或者你也可以使用单引号来做同样的事情:

    echo preg_replace("/(foo)/ei",  '$mx[(\'\\1\')]',  $string );
    

    【讨论】:

    • 那他的输出不是"$mx[('foo')] is $mx[('foo')]bar, baz is widgets"吗?
    【解决方案2】:

    您的preg_replace 使用双引号,由PHP 解释。看起来您不需要如此复杂的设置,因为据我所知,这是一个简单的字符串替换。一个更简单的解决方案是:

    $string = str_replace('foo', 'vvv', $string);
    

    你也可以使用你的数组:

    $replacements = array(
        'foo' => 'vvv'
    );
    foreach ($replacements as $key => $replacement) {
        $string = str_replace($key, $replacement, $string);
    }
    

    这会将给定数组中的所有键替换为关联的值。

    【讨论】:

    • 您可以将键/替换数组传递给str_replace,然后您就不需要使用foreach 循环
    • 但这意味着两个数组,对吧?这在这里不是很方便,因为要记住它们的同步是一件额外的事情。
    • 您仍然可以像您的示例一样拥有单个关联替换数组,只需相应地获取键/值:preg_replace(array_keys($replacements), array_values($replacements), $string)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2013-03-05
    相关资源
    最近更新 更多