Intereting Posts
Как различить пустую строку с нулевым размером в DOMDocument? Увеличьте время выполнения в Google App Engine PHP: Как передать несколько переменных в массив? Перезагрузить родительскую страницу после отправки в iframe (javascript / jquery) Не удалось установить phpmyadmin на PHP7 Apache / 2.4.7 (Ubuntu) Выберите строки в качестве столбцов для сообщения wordpress meta Что такое регулярное выражение для решения этой проблемы? Javascript не загружается при начальной загрузке страницы Совместная сессия между двумя веб-сайтами HTML – изменение цвета в текстовой области из опции внутри поля выбора, сгенерированного из mysql Путаница PHP-типа Как внутреннее соединение работает с отношениями «многие ко многим» с помощью Doctrine и Symfony2 Bootstrap Кнопка загрузки состояния загрузки JQuery, как заставить другие состояния делать то же самое Как использовать «корневое» пространство имен php? Ошибка подключения сервера Apache FastCGI

Согласование свободно сформированных URL-адресов с использованием регулярных выражений и php?

Я пытаюсь идентифицировать URL-адреса в наборе текста. Однако я хотел бы иметь возможность идентифицировать слабо сформированные URL-адреса, такие как:

example.com
www.example.com

Я не очень хорошо разбираюсь в regex 🙁

Я нашел ниже, но, к сожалению, это требует схемы.

/(([[:alnum:]]+:\/\/)|www\.)([^[:space:]]*)([[:alnum:]#?\/&=])/i 

Можно ли совместить целую строку (без пробелов), которая включает в себя .com или .net или .org и т. Д.?

благодаря

Чтобы соответствовать только любой строке символов, которые не содержат пробела и конца в «.com», «.net» или «.org»:

 /[^\s]+\.(?:com|net|org)\b/i 

Объяснение:

  • / = Начало регулярного выражения
  • [^\s] = Not ( ^ ) символ пробела ( \s )
  • + = Один или несколько из предыдущих наборов (символы без пробелов)
  • \. = Точка. Точки в RegExps – это специальные символы, иначе
  • (?: ... ) = группа, но не одна для хранения
  • com|net|org = com ИЛИ net OR org (здесь вы можете добавить больше, разделяя «|»)
  • \b = граница слова – конец слова
  • / = Конец регулярного выражения (кроме необязательных флагов)
  • i = Нечувствительность к случаю

Продление ответа

По запросу OP ниже приведен пример (грубая) RegExp, которая должна соответствовать URL-адресу домена, заканчивающегося указанными строками, и одной или несколькими парами ключ = значение в строке запроса.

 /[^\s]+\.(?:com|net|org)[^\s]+\?[^\s]+=[^\s]+(?:\&?[^\s]+=[^\s]+)*\b/i 
  • / = Начало регулярного выражения
  • [^\s]+\.(?:com|net|org) = Как и раньше
  • [^\?]+ = Один или несколько символов без знака (это будет любая папка или имена файлов). Опять же, Questionmark имеет \ перед тем, чтобы он рассматривался как нормальный символ, поскольку в противном случае он имеет особое значение здесь
  • \? = A Questionmark
  • [^\s]+\=[^\s]+ = одно или несколько небелых пространств, затем знак равенства, затем одно или несколько не-белых пространств
  • (?:\&?[^\s]+=[^\s]+)* = Нет или больше наборов амперсанда & , затем еще одно или несколько небелых пространств, знак равенства и один или несколько не- пробельные символы
  • \b = Конец строки
  • / = Конец регулярного выражения
  • i = Нечувствительность к случаю

ПРИМЕЧАНИЕ. Это не ищет полностью допустимые URL-адреса и не позволяет использовать множество кодов стран (например, «.com.au» для Австралии) или другие домены верхнего уровня (например, «.edu» и т. Д.). Но, он будет соответствовать приведенной строке примера, twitter.com/example?var=true

Риск ложных срабатываний есть, но минимальный. Поэтому вы действительно можете использовать что-то вроде:

 /\b(([-\w]{2,}\.)+(com|net|org|info)|www(\.\w{3,})+\.\w{2,6})\b/i 

Первая половина для обычных доменов .com / .net, вторая соответствует всем с www. префикс. Это сложнее, если вы хотите обнаружить эти доменные имена в дополнение к полным http: // urls.

 ~(?:https?://)?(?:[-\w]+\.)+[az]{2,6}[^\s]*~ 

Regex @ Rubular