【问题标题】:What's special about `str_replace`?`str_replace` 有什么特别之处?
【发布时间】:2016-09-30 06:02:39
【问题描述】:

我想编写一个函数,允许我用数组中的连续值替换字符串中重复的标记,以便 WHERE name = ? and age ?array('joe', 32) 变为 Where name = joe and age = 32。 (我知道变量绑定不应该“手动”完成;我正在尝试对传递给雄辩的 DB::select 语句的参数进行故障排除)。

这是我写的:

function str_replace_array($search, array $replace, $subject ) {
    foreach ( $replace as $replacement ) {
        $subject = str_replace($search, $replacement,$subject,1);
    }
    return $subject;
}

但是 php 5.6.20 给了我这个错误:

$ php -l str_replace_array.php
PHP Fatal error:  Only variables can be passed by reference in str_replace_array.php on line 5
Errors parsing str_replace_array.php

我知道它是函数str_replace(),因为用虚拟函数替换它可以让它通过语法检查。虽然,没有一个变量与受让人和参数具有相同的变量——但是有什么表明这在这个函数中不起作用吗?

manual entry 并不表示任何参数都是通过引用传递的;它表示一个返回值,所有的例子都显示了赋值。

这里有什么问题?

【问题讨论】:

    标签: php


    【解决方案1】:

    str_replace 的最后一个参数带变量保存计数,而不是替换 n 次;

    使用 preg_replace

    function str_replace_array($search, $replace, $subject ) {
        foreach ( $replace as $replacement ) {
            $subject = preg_replace("/\?/", $replacement,$subject, 1);
        }
        return $subject;
    }
    echo (str_replace_array("?",array(1,2,3),"awdwad ? asdaw ? awdwa? awd"));
    

    结果:“awdwad 1 asdaw 2 awdwa3 awd”

    【讨论】:

    • 使用 preg_quote 函数你仍然可以通过 $search。
    【解决方案2】:

    由于str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] ) 的最后一个参数直接设置为1,您需要将其设置为某个变量,例如$count,因为它的值将设置为执行的替换次数。所以改成:

    ..
    $subject = str_replace($search, $replacement,$subject, $count);
    ..
    

    【讨论】:

    • 天哪——有没有办法限制它正在做的替换次数?
    • @user151841 好吧,你不能只用 str_replace 来做到这一点,你必须编写一些自定义函数来限制 str_replace
    • 看起来preg_replace()是答案stackoverflow.com/questions/1252693/…
    • 是的,这就是要走的路:)
    猜你喜欢
    • 2011-04-18
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 2013-05-11
    • 2016-08-20
    • 2011-05-19
    相关资源
    最近更新 更多