繁体   English   中英

用正则表达式匹配并替换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

一个稍微有点怪异的解决方案是在发送每个值之前添加一个@符号。 这将使错误消息消失,并仅返回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);

};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM