PHP Regex - / я без учета регистра и странные пустые элементы массива - PullRequest
0 голосов
/ 05 февраля 2009

Исходные тексты (7):

  1. дают 4 машины
  2. 5 автомобилей
  3. GA 5 Автомобили @ Mustang необходимо шесть выхлопов
  4. Give -1 Cars @mustang
  5. Give Cars @mustang
  6. Give 3 Cars @ ford
  7. Даешь 5 машин @ cobra_gt

Те, которые должны быть успешными, съели 1,2,3,6,7

preg_match ('/ Give (\ d +) Cars @ (\ w +) | GA (\ d +) Cars @ (\ w +) / i', $ a-> text, $ output);

print_r ($ выход); производит:

Array
(
)
Array
(
)
Array
(
    [0] => GA 5 Cars @mustang
    [1] => 
    [2] => 
    [3] => 5
    [4] => mustang
)
Array
(
)
Array
(
)
Array
(
    [0] => Give 3 Cars @ford
    [1] => 3
    [2] => ford
)
Array
(
    [0] => Give 5 Cars @cobra_gt
    [1] => 5
    [2] => cobra_gt
)

Как видите, он не работает со строчными буквами, а для номера 3 он не создает правильный массив, он создает пустые элементы. Есть идеи, где я иду не так?

Ответы [ 2 ]

3 голосов
/ 05 февраля 2009

1 и 2 отсутствуют @ 4 имеет -1 (это не соответствует \ d) 5 отсутствует номер

Вы можете изменить "@" на "(@)?" сделать @ необязательным.

Или:

preg_match('/(Give|GA) (-?\d+) Cars( @(\w+))?/i', $a->text, $output);

Что касается пустых элементов массива, у вас есть 4 подспаривания, даже если они разделены или или (|), все они имеют значение, и будут заполнены только те, которые используются в вашем сопоставлении.

2 голосов
/ 05 февраля 2009

С учетом ввода:

  1. дают 4 машины
  2. 5 автомобилей
  3. GA 5 Cars @ Mustang шесть выхлопных газов необходимо
  4. Give -1 Cars @ mustang
  5. Give Cars @ mustang
  6. Give 3 Cars @ ford
  7. Даешь 5 машин @ cobra_gt

И выражение:

/Give (\d+) Cars @(\w+)|GA (\d+) Cars @(\w+)/i
  1. Не соответствует, потому что вы только сопоставление с чем-то, что имеет "@something" в нем.
  2. То же, что # 1
  3. Это соответствует ожидаемому
  4. - перед 1 приводит к сбою матча
  5. Нет числа между Give и Cars
  6. Это соответствует ожидаемому
  7. Это соответствует ожидаемому

Относительно того, почему он не создает «правильный» массив, это действительно так. В вашем выражении у вас есть 4 группы захвата. Тот факт, что ваш ввод соответствует второму из выражений OR («GA»), не означает, что номера групп начинаются с 1, у групп всегда будет одинаковое число, независимо от того, как вы подходите. ..

/Give (\d+) Cars @(\w+)|GA (\d+) Cars @(\w+)/i
      ^ 1         ^ 2      ^3          ^4

Таким образом, если вы соответствуете регистру 'Give', у вас будут группы 1 и 2, а если вы совпадете с регистром GA, группы 3 и 4 будут заполнены.

(Кроме того, модификатор 'i' работает нормально, вы просто неправильно учитываете свои данные)

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