Подскажите регулярку на PHP для строки без двух точек подряд
Имеется регулярка вот такого вида (цифры, буквы, подчёркивание, скобочки, тире):
[A-Za-z0-9_\-\(\)]+
Не могу понять как её модифицировать, чтоб она не пропускала строки в которых в любом месте есть две точки подряд...
По идее должно добавиться что-то в духе:
^[\\.\\.]
Но у меня в голове синтаксис JS'ных регулярок перемешался с PHP'шными, не могу добиться нужного результата.
Ответы (2 шт):
Автор решения: Wiktor Stribiżew
→ Ссылка
И в PHP, и в JavaScript можно воспользоваться блоком предварительного просмотра (?!.*\.\.) / (?![\w\W]*\.\.):
/^(?!.*\.\.)[A-Za-z0-9_().-]+$/ // Для однострочных текстов
/^(?!.*\.\.)[A-Za-z0-9_().-]+$/s // Для многострочных текстов
/^(?![\w\W]*\.\.)[A-Za-z0-9_().-]+$/ // Для многострочных текстов
А так как [A-Za-z0-9_] эквивалентен \w, вы можете использовать
/^(?!.*\.\.)[\w().-]+$/ // Для однострочных текстов
/^(?!.*\.\.)[\w().-]+$/s // Для многострочных текстов
/^(?![\w\W]*\.\.)[\w().-]+$/ // Для многострочных текстов
Есть ещё один сценарий, когда нужно не пропускать строки с переводом строки (LF, "line feed") в конце:
/^(?!.*\.\.)[\w().-]+$/sD // Для многострочных текстов, в конце не должно быть LF
Подробности
^- начало строки(?!.*\.\.)- негативный блок предварительного просмотра, который отменяет совпадение, если сразу после текущей позиции находится ноль и более (как можно более) любых символов, а затем..[\w().-]+- одна и более букв, цифр, символов нижнего подчёркивания, круглых скобок, точки и дефиса$- конец строки.