Php reg exp: соответствующий повторяющийся шаблон - PullRequest
1 голос
/ 31 октября 2009

Я хочу сопоставить строки, подобные приведенным ниже.

abc|q:1,f:2
cba|q:1,f:awd2,t:3awd,h:gr

Я использую php и пробовал и preg_match, и preg_match_all с этим выражением.

/^([a-z]+)\|([a-z]+:[a-z0-9]+,?)+$/iU

Возвращает только первую часть перед конвейером, а одну a: 1. Что я делаю не так, почему так себя ведет и как заставить работать?

Ответы [ 3 ]

3 голосов
/ 31 октября 2009
/^([a-z]+)\|((?:[a-z]+:[a-z0-9]+,?)+)$/iU

будет захватывать:

  • деталь перед трубой
  • часть после части

Жадная природа квантификатора '+' заставляет вашу группу захвата ([az] +: [a-z0-9] + ,?) захватывать только последний набор символов, соответствующий этому регулярному выражению.

/(?ms)^((?:[a-z]+)\|(?:[a-z]+:[a-z0-9]+,?)+)$/iU

захватит всю линию.

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

0 голосов
/ 31 октября 2009
$string = 'cba|q:1,f:awd2,t:3awd,h:gr';

$re = '~(?:  ^(\w+)\| ) | (?: (\w+) : (\w+) (?:,|$) )~x';
preg_match_all($re, $string, $m, PREG_SET_ORDER);
var_dump($m);

это будет соответствовать части перед конвейером ("ведущим") и всем парам ключ-значение одновременно. "лидерство" будет в $m[0][1], а значения ключа будут в $m[1..x][2] and [3]. Добавьте некоторую простую постобработку, чтобы преобразовать ее в удобную форму, например:

$lead = $m[0][1];
foreach(array_slice($m, 1) as $p)
    $data[$p[2]] = $p[3];
var_dump($lead, $data);
0 голосов
/ 31 октября 2009

Я только что попробовал:

<?php
$string = 'cba|q:1,f:awd2,t:3awd,h:gr';
$subpat = '[a-z]+:[a-z0-9]+';
$pat = "/^([a-z]+)\|($subpat(?:,$subpat)+)$/i";
preg_match( $pat, $string, $matches );
print_r( $matches );
?>

, что дает

Array
(
    [0] => cba|q:1,f:awd2,t:3awd,h:gr
    [1] => cba
    [2] => q:1,f:awd2,t:3awd,h:gr
)

На данный момент у вас есть деталь перед вертикальной чертой в matches[1], а остальная часть в matches[2]. Повторение $subpat есть для правильного разделения строк запятыми. После этого примените explode к matches[2].

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