Мне нужна помощь с этим шаблоном регулярных выражений - PullRequest
1 голос
/ 07 июня 2011

Привет У меня проблема с моим шаблоном регулярных выражений:

preg_match_all('/!!\d{3}/', '!!333!!333 !!333 test', $result);

Я хочу, чтобы это совпадало с !! 333, но не с !! 333! 333.Как я могу изменить это регулярное выражение, чтобы соответствовать только максимальная длина 5 символов - два!и три цифры.

Ответы [ 3 ]

6 голосов
/ 07 июня 2011
/^!!\d{3}$/

Вам нужны якоря ^, которые соответствуют началу строки и $ для конца.Это все равно что сказать: «Оно должно начинаться с начала строки, а оно должно заканчиваться в конце».Если вы пропустите один (или оба), то в шаблоне допускаются произвольные символы в начале и / или конце.

Обновление

Как я выяснил в комментариях, вопрос очень вводил в заблуждение.Теперь я предлагаю разделить строку перед применением шаблона

$string = '!!333!!333 !!333 test';
$result = array();
foreach (explode(' ', $string) as $index => $item) {
  if (preg_match('/^!!\d{3}$/', $item)) {
    $result[$index] = $item;
  }
}

Это также учитывает индекс элемента.Если вам это не нужно, удалите материал $index или просто проигнорируйте его;)

Это гораздо проще, чем попытаться найти шаблон, который сразу выполнит ваш запрос.

2 голосов
/ 07 июня 2011
^!!\d{3}$

Вам нужно привязать свой шаблон.

Если вы хотите сопоставить строку с !! 333 в ней, вы можете захотеть что-то вроде:

(^|\s)!!\d{3}($|\s)

С дальнейшимиобъяснение, которое мы можем уточнить:

(^|\s)!!\d{3}(?=$|\s)

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

0 голосов
/ 07 июня 2011

Я считаю, что самый простой и описательный способ сделать это - использовать негативные взгляды и взгляды назад.

См:

preg_match_all('/(?<![^\s])!!\d{3}(?![^\s])/', '!!333 !!333!!333 !!333 test !!333', result);

Это говорит: сопоставьте что-нибудь в форме !! [0-9] [0-9] [0-9], у которой нет ничего кроме пробела впереди или позади него Обратите внимание, что эти lookaheads / lookbehind сами по себе не совпадают, они являются «утверждениями нулевой ширины», они отбрасываются, и поэтому вы получаете только «!! 333» и т. Д. В своем совпадении, а не «!! 333» и т. Д.

Возвращает

[0] => Array
        (
            [0] => !!333
            [1] => !!333
            [2] => !!333
        )

)

Также

preg_match_all(
    '/(?<![^\s])!!\d{3}(?![^\s])/', 
    '!!333 !!555 !!333 !!123 !!555 !!456 !!333 !!333 !!444 !!444 !!123 !!123 !!123!!123',
    $result));

возвращает

[0] => Array
    (
        [0] => !!333
        [1] => !!555
        [2] => !!333
        [3] => !!123
        [4] => !!555
        [5] => !!456
        [6] => !!333
        [7] => !!333
        [8] => !!444
        [9] => !!444
        [10] => !!123
        [11] => !!123
    )

То есть все, кроме двух последних, слишком длинные.

См. Учебник Lookahead .

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