Regex: сделать условие «ноль или один раз», но только для последнего матча - PullRequest
1 голос
/ 03 июня 2019

У меня есть эта строка:

key1:val1;key2:val2;key3:val3

Она также может быть написана так:

key1:val1;key2:val2;key3:val3;

Я хочу preg_match_all обе строки выше, так что он будет возвращать тот же массив, как этот:

МАТЧЕЙ 1

Array
(
    [0] => key1
    [1] => key2
    [2] => key3
)

МАТЧЕЙ 2

Array
(
    [0] => val1
    [1] => val2
    [2] => val3
)

Сейчас я использую это регулярное выражение:

(.*?):(.*?);

К сожалению,это не работает для первой строки.Ранее я пытался использовать регулярные выражения, но результат был хуже:

(.*?):(.*?);?

Вот мой эксперимент: https://3v4l.org/5HAco.Если для решения этой проблемы есть функция PHP, я тоже могу принять ее.

1 Ответ

2 голосов
/ 03 июня 2019
$text = "key1:val1;key2:val2;key3:val3";

preg_match_all("/(.*?):(.*?)(?:;|$)/",$text,$matches);
print_r($matches);


$text = "key1:val1;key2:val2;key3:val3;";

preg_match_all("/(.*?):(.*?)(?:;|$)/",$text,$matches);
print_r($matches);

Выход:

Array
(
    [0] => Array
        (
            [0] => key1:val1;
            [1] => key2:val2;
            [2] => key3:val3
        )

    [1] => Array
        (
            [0] => key1
            [1] => key2
            [2] => key3
        )

    [2] => Array
        (
            [0] => val1
            [1] => val2
            [2] => val3
        )

)
Array
(
    [0] => Array
        (
            [0] => key1:val1;
            [1] => key2:val2;
            [2] => key3:val3;
        )

    [1] => Array
        (
            [0] => key1
            [1] => key2
            [2] => key3
        )

    [2] => Array
        (
            [0] => val1
            [1] => val2
            [2] => val3
        )

)
...