【问题标题】:match and replace multi pattern on php string with regex用正则表达式匹配并替换php字符串上的多模式
【发布时间】:2019-06-06 10:33:33
【问题描述】:

我有这样的代码来查找模式,例如##random_number_10## 我需要将数字 10 用作函数中的参数,并且该函数将转到 str_replace 以替换模式

字符串:

ini subjek lur ##random_mix_5## ##random_string_up_10## ##random_number_15##

输出:

ini subjek lur o1ovp HDBVPVJTYY 741007211142434

.

function replace ($sumber) {

        preg_match_all("/##random_number_(\d+)##/", $sumber, $match_number);
        preg_match_all("/##random_string_up_(\d+)##/", $sumber, $match_string_up);
        preg_match_all("/##random_string_low_(\d+)##/", $sumber, $match_string_low);
        preg_match_all("/##random_string_uplow_(\d+)##/", $sumber, $match_string_uplow);
        preg_match_all("/##random_mix_(\d+)##/", $sumber, $match_mix);

        $dari = [
            $match_number[0][0], 
            $match_string_up[0][0], 
            $match_string_low[0][0], 
            $match_string_uplow[0][0], 
            $match_mix[0][0]
        ];

        $ke   = [
            random_number($match_number[1][0]), 
            random_string_up($match_string_up[1][0]), 
            random_string_low($match_string_low[1][0]), 
            random_string_uplow($match_string_uplow[1][0]), 
            random_mix($match_mix[1][0])
        ];

        return str_replace($dari, $ke, $sumber);

    };

问题是当我尝试替换所有这些时,如果字符串不包含其中一项搜索,则会出现错误。还有其他方法可以替换字符串上的模式吗?

【问题讨论】:

    标签: php string replace str-replace preg-match-all


    【解决方案1】:

    您可能会收到Undefined offset 通知,因为您引用了一个不存在的数组键:

    $sumber = "ini subjek lur ##random_mix_5## ##random_string_up_10## ##random_number_15##";
    
    preg_match_all("/##random_number_(\d+)##/", $sumber, $match_number);
    preg_match_all("/##random_string_up_(\d+)##/", $sumber, $match_string_up);
    preg_match_all("/##random_string_low_(\d+)##/", $sumber, $match_string_low);
    preg_match_all("/##random_string_uplow_(\d+)##/", $sumber, $match_string_uplow);
    preg_match_all("/##random_mix_(\d+)##/", $sumber, $match_mix);
    
    var_dump($match_string_uplow[1][0]);
    

    将输出:Notice: Undefined offset: 0 on line 11

    一个有点老套的解决方案是在发送每个值之前添加一个@ 符号。这将隐藏错误消息并简单地返回 NULL 值:

    var_dump(@$match_string_uplow[1][0]);
    

    将输出:NULL

    现在,如果您不提交值,也可能是您正在调用的函数生成错误。在这种情况下,解决方案将取决于您的函数在定义值时的严格程度。

    【讨论】:

    • @MukhlisAkbarrudin:隐藏错误消息从不是个好主意。
    • @Toto 虽然我原则上完全同意你的观点,但在这种特殊情况下,你所隐藏的只是一个预期的undefined offset 通知。坦率地说,大多数人无论如何都会关闭所有notice 级别错误,所以在这里隐藏它并不是什么大罪。但是,我同意不要使用 @ 前缀养成习惯。
    【解决方案2】:

    仅当存在匹配时才构建 2 个数组:

    function replace ($sumber) {
        $dari = array();
        $ke = array();
        if (preg_match_all("/##random_number_(\d+)##/", $sumber, $match)) {
            $dari[] = $match[0];
            $ke[]   = $match[1]
        }
        if (preg_match_all("/##random_string_up_(\d+)##/", $sumber, $match)) {
            $dari[] = $match[0];
            $ke[]   = $match[1]
        }
        if (preg_match_all("/##random_string_low_(\d+)##/", $sumber, $match)) {
            $dari[] = $match[0];
            $ke[]   = $match[1]
        }
        if (preg_match_all("/##random_string_uplow_(\d+)##/", $sumber, $match)) {
            $dari[] = $match[0];
            $ke[]   = $match[1]
        }
        if (preg_match_all("/##random_mix_(\d+)##/", $sumber, $match)) {
            $dari[] = $match[0];
            $ke[]   = $match[1]
        }
    
        return str_replace($dari, $ke, $sumber);
    
    };
    

    【讨论】:

      猜你喜欢
      • 2015-11-30
      • 2020-07-12
      • 2022-12-01
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多