Подскажите регулярку на 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().-]+ - одна и более букв, цифр, символов нижнего подчёркивания, круглых скобок, точки и дефиса
  • $ - конец строки.

См. пример работы регулярного выражения.

→ Ссылка
Автор решения: Qwertiy

Выбирай:

^((?!\.\.).)*$
^(?!.*\.\.)
→ Ссылка