用正则表达式匹配和替换 php 字符串上的多模式

match and replace multi pattern on php string with regex

我有这样的代码来查找模式,例如##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);

    };

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

您可能会收到 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

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

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

将输出:NULL

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

仅在匹配时构建 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);

};