сопоставьте и замените шаблон multi в строке php на регулярное выражение - PullRequest
0 голосов
/ 06 июня 2019

У меня есть такой код, чтобы найти шаблон, например ## 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);

    };

проблема в том, что, когда я пытаюсь заменить их все, появляется ошибка, если строка не содержит один из поисков. Есть ли другой способ заменить шаблон в строке?

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Создайте 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);

};
1 голос
/ 06 июня 2019

Вы, вероятно, получаете уведомление 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

Теперь также может случиться так, что ваша ошибка генерируется вызываемой вами функцией, если вы не отправите ей значение. В этом случае решение будет зависеть от того, насколько строгой является ваша функция при определении значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...