Почему preg_match соответствует нескольким пустым строкам - PullRequest
0 голосов
/ 13 февраля 2020

Почему следующее регулярное выражение:

$regex = '^([abc]+)$|^([012]+)$|^([23]+)$|^([123]+)$';
$toMatch = '123';
preg_match('/'.$regex.'/', $toMatch, $matches);

приводит к такому результату:

array(5) {
  [0]=>
  string(3) "123"
  [1]=>
  string(0) ""
  [2]=>
  string(0) ""
  [3]=>
  string(0) ""
  [4]=>
  string(3) "123"
}

Почему элементы 1,2 и 3 являются пустыми строками, если они не совпадают ни с чем ? Как получаются «пустые» матчи?

заранее спасибо

Ответы [ 2 ]

3 голосов
/ 13 февраля 2020

Вы попытались захватить 4 разные вещи с синтаксисом (). Следовательно, в массиве $matches будет 4 разных элемента. Только последний захват будет соответствовать строке 123 (^[123]+$).

См. Документацию

2 голосов
/ 13 февраля 2020

Вы получаете 3 пустых элемента из-за того, что ваши первые три группы захвата ([abc]+), ([012]+) и ([23]+) ничего не соответствуют.

Если вам нужна только одна группа захвата, вы можете обновите свое регулярное выражение следующим образом:

preg_match('/^([abc]+|[012]+|[23]+|[123]+)$/', '123', $match);

Что даст вам:

array(2) {
  [0]=>
  string(3) "123"
  [1]=>
  string(3) "123"
}
...