PHP регулярное выражение: разделить на неэкранированный разделитель - PullRequest
2 голосов
/ 09 декабря 2011

Я могу разбить строки в формате key:value;, используя следующий код:

$inside = "key1:value1;key2:value2;key3:value3;";
preg_match_all("/([^:]+):([^;]+);/s", $inside, $pairs);

Я хотел бы разрешить вхождение символа двоеточия и точки с запятой взначения путем введения escape-символа, например \; любая двоеточие или точка с запятой, непосредственно предшествующие обратной косой черте, будут игнорироваться.

Бонусные баллы, если в одном и том же регулярном выражении экранированные символы могут быть сохранены в массиве неоткрытых совпадений без необходимости проходить все через str_replace.Спасибо за любую помощь, которую вы можете предложить.

Ответы [ 2 ]

3 голосов
/ 09 декабря 2011
preg_match_all(
    '/(                    # Match and capture...
     (?:                   # either:
      \\\\.                # an escaped character
     |                     # or:
      [^\\\\:]             # any character except : or \
     )+                    # one or more times
    )                      # End of capturing group 1
    :                      # Match a colon
    ((?:\\\\.|[^\\\\;])+); # Same for 2nd part with semicolons
    /x', 
    $inside, $pairs);

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

Чтобы соответствовать конечному элементу, даже если он не заканчивается разделителем, измените ; на (?:;|$) (то же самое для :). И для возврата пустых элементов также измените + на *.

2 голосов
/ 09 декабря 2011

Вы можете сделать:

$inside = "key\:1:value\;1;key2:value2;key3:value3;";
$pairs = preg_split('/(?<!\\\\);/',$inside,-1,PREG_SPLIT_NO_EMPTY );
foreach($pairs as $pair) {
        list($k,$v) = preg_split('/(?<!\\\\):/',$pair);
        // $k and $v have the key and value respectively.
}

Посмотреть

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