preg_match основы вопроса - PullRequest
0 голосов
/ 19 мая 2010

У меня проблемы с моим preg_match. Код.

$text = "tel: 012 213 123. mobil: 0303 11234 \n address: street 14";
$regex_string = '/(tel|Tel|TEL)[\s|:]+(.+)[\.|\n]/';

preg_match($regex_string , $text, $match);

И я получаю этот результат в $ match [2]

"012 213 123. mobil: 023 123 123"

Первый вопрос. Я хочу, чтобы регулярное выражение остановилось на точке (точка), но это не так. Может кто-нибудь объяснить, почему это не так?

Второй вопрос. preg_match использует (), чтобы получить их соответствие. Можно ли пропустить круглые скобки, окружающие другой «Тел», и при этом получить ту же функциональность?

Спасибо, что весь стекопоток велик: D

Ответы [ 5 ]

1 голос
/ 19 мая 2010

Вы имеете в виду, что хотите сопоставить только число, чтобы вам не пришлось снимать tel: и точку?Попробуйте это:

/tel[:\s]+\K[^.]+/i

i делает его без учета регистра.

[:\s] соответствует двоеточию или пробелу (| не означает «или» в классе символов, он просто соответствует |).

[^.]+ соответствует одной или нескольким не точкам;он прекращает сопоставление, когда видит точку или конец линии, поэтому вам не нужно сопоставлять точку, если вы не хотите, чтобы это было в результате.обо всем, что вы до сих пор сравнивали и притворялись, что матч действительно начался здесь "- небольшая жемчужина функции, доступной только в Perl и PHP (о которой я знаю).

1 голос
/ 19 мая 2010

Почему у вас есть каналы в ваших классах персонажей [\.|\n] и [\s|:]? Классы символов (в квадратных скобках []) по определению похожи на отношения ИЛИ, поэтому вам не нужен канал ... если вы действительно не пытаетесь сопоставить канал |.

Что касается вопроса № 1, я не уверен, в чем суть вашей проблемы, но обычно это связано с жадными квантификаторами. Квантификатор (.+) является жадным, поэтому он соответствует как можно большему количеству, в то же время сопоставляя весь шаблон. Жадным квантификаторам все равно, что следует за ними в схеме. Поскольку период . соответствует любому символу, кроме символов новой строки, он может соответствовать периоду и поэтому соответствует периоду. Чтобы сделать квантификатор не жадным, вы можете использовать знак вопроса ?.

Для вашего второго вопроса В RegEx используются круглые скобки для группировки вещей и их хранения. Если вы хотите сгруппировать (tel|Tel|TEL), но не хранить его в $match, вы можете поставить ?: в после открывающей скобки:

(?:tel|Tel|TEL)
1 голос
/ 19 мая 2010

Если вы просто пытаетесь извлечь номер телефона из этой линии, и он гарантированно будет 11 номерами, вы можете просто использовать это:

$text = 'tel: 012 213 123. mobil: 0303 11234';
$phone_number = substr(preg_replace('/[^\d]/', '', $text), 0, 11);`

В вашем примере $phone_number будет 0122131230.

Как это работает, любая нецифровка заменяется пустой строкой, удаляя ее, а затем возвращаются первые 11 чисел.

1 голос
/ 19 мая 2010

Понятия не имею - ваше регулярное выражение работает для меня (я получаю "012 213 123" в $match[2] с вашим кодом). Тот факт, что мобильный телефон отличается между ними, может указывать на то, что на самом деле это не вывод вашего кода; проверьте еще раз.

Некоторые другие вещи - если у вас в строке будет больше точек (например, «tel: xxx. Phone: xxx. Fax: xxx»), вы получите плохие результаты - используйте не жадные операторы («получите наименьшее чанк, который соответствует ".*? вместо" получить самый большой чанк, который соответствует ".*) или ограничить повторяющиеся символы (" любое количество непериодов "[^.]*). Кроме того, вы можете избавить себя от проблем, сделав регулярное выражение без учета регистра (если только вы действительно не ненавидите людей, набирающих «tEl»).

Ваш другой вопрос: (?:stuff) будет соответствовать «материалу» так же, как (stuff), но не захватит его.

Полезная ссылка: http://www.regular -expressions.info /

1 голос
/ 19 мая 2010

Это должно сделать:

/tel(?:\s|:)+([^.]+)(?:\.|$)/i

+ - это жадный квантификатор, что означает, что он будет соответствовать как можно большему числу символов.

К вашему второму вопросу: в данном конкретном случае вам просто нужно использовать регистрозависимое совпадение (флаг i). Как правило, вы можете использовать синтаксис (?:...), пример которого вы можете увидеть в конце матча. Квадратные скобки используются для классов персонажей.

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