Regexp оглядываться назад, чтобы соответствовать скорости интернета - PullRequest
1 голос
/ 20 апреля 2010

Таким образом, пользователь может искать «10 мбит», после чего я хочу захватить «10», чтобы я мог использовать его для быстрого поиска, а не для поиска строк.Это не проблема, приведенное ниже регулярное выражение делает это нормально:

if (preg_match("/(\d+)\smbit/", $string)){ ... }

Но пользователь может искать что-то вроде «10/10 мбит» или «10-100 мбит».Я не хочу сопоставлять те с приведенным выше регулярным выражением - они должны обрабатываться по-другому.Поэтому я хотел бы получить регулярное выражение, которое соответствует «10 мбит», если число полностью числовое как целое слово (то есть содержит пробел, символ новой строки или lineend / linestart)

Используя lookbehind, я сделал это:*

if (preg_match("#(?<!/)(\d+)\s+mbit#i", $string)){

Просто чтобы поймать тех, у кого нет «/» перед ними, но это соответствует действительности для этой строки: «10/10 мбит», так что я, очевидно, что-то делаю не так, но что?

Ответы [ 2 ]

1 голос
/ 20 апреля 2010

Если косая черта или дефис - единственное, что вас волнует, это должно сделать это:

'#(?<![\d/-])(\d+)\s+mbit#i`

Проблема с вашим регулярным выражением состоит в том, что \d+ требуется только для соответствия одной цифре.Он не может соответствовать 10 в 10/10 mbit, потому что ему предшествует косая черта, а 0 - нет.Чтобы убедиться, что оно совпадает с начала числа, вы должны включить \d в список вещей, которым не может предшествовать.

0 голосов
/ 20 апреля 2010

Вы смотрите, утверждение отрицательно. Он говорит, что строке не должно предшествовать /

Таким образом, / совпадает внутри строки (поскольку регулярное выражение не может соответствовать только «10»: вы явно запрещаете это утверждением). Может быть, вы хотели позитивный взгляд позади?

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