Intereting Posts
Вход с Amazon говорит, что пользователь не согласился, но у них есть – Alexa SMAPI JQuery Добавить значения для выбора параметров php shell_exec с обновлением в реальном времени внутренние таблицы подключения mysql как получить название категории текущего продукта (на странице сведений о продукте) в magento Включить XML в ответ SOAP Как получить доступ к таблице внутри схемы без использования префикса схемы (Postgres + PHP)? Как запустить Java-программу и получить выход на PHP? Кудрявые фигурные скобки или заявления о двоеточии endif в PHP – какой из них обеспечивает лучшую производительность и совместимость с кодом? Как запросить с активной записью в codeigniter для дат между указанными временами Как разобрать блок комментариев PHP-стиля PHP? функция друга в php? Получение минимальной суммы заказа для метода «Бесплатная доставка» на странице проверки Предупреждение: mysql_num_rows () ожидает, что параметр 1 будет ресурсом, boolean указан в /home/folder/public_html/folder/folder/login.php в строке 18 Выйти из системы в приложении Symfony 2, когда включена опция «запомнить меня»

Соответствие регулярных выражений, если максимум два вхождения точки и тире

Мне нужно регулярное выражение, которое будет соответствовать любой строке, содержащей не более 2 тире и 2 точки. Там не должно быть ни черты, ни точки, но если есть 3+ тире или 3 точки или даже 3 + тире и 3+ точки, то регулярное выражение не должно совпадать с строкой.

Предназначен для использования в PHP.
Я знаю о простых альтернативах с использованием функций PHP, но он должен использоваться в большой системе, которая просто позволяет фильтровать с использованием регулярных выражений.

Пример строки, которая будет MATCHED:
hello-world.com

Пример строки, которая НЕ будет соответствовать:
www.hello-world.easy.com или hello-world-i-win.com

Это соответствует вашим ожиданиям?

(?!^.*?([.-]).*\1.*\1.*$)^.*$ 

См. Здесь, в Regexr

(?!^.*?([.-]).*\1.*\1.*$) Является негативным взглядом. Он совпадает с первым .- Поместите его в группу захвата 1, а затем проверьте, есть ли еще два из них, используя hte backreference \1 . Как только он найдет три, выражение больше не будет соответствовать.

^.*$ соответствует всем от начала до конца, если отрицательный lookahead не соответствует.

Это проверенное регулярное выражение будет делать трюк:

 $re = '/# Match string with 2 or fewer dots or dashes ^ # Anchor to start of string. (?=[^.]*(?:\.[^.]*){0,2}$) # Assert 2 or fewer dots. (?=[^\-]*(?:-[^\-]*){0,2}$) # Assert 2 or fewer dashes. .* # Ok to match string. $ # Anchor to end of string. /sx'; 

Используйте это: (?!^.*?([-.])(?:.*\1){2}.*$)^.*$