Какое должно быть регулярное выражение для поиска URL?

Для поиска URL в строке текста можно использовать регулярное выражение. URL (Uniform Resource Locator) представляет собой адрес, по которому можно найти ресурс в сети Интернет.

Прежде чем создавать само регулярное выражение, необходимо понять, что значит "правильный" URL. В стандарте RFC 3986 определены общие правила для URL:

- URL может начинаться с протокола (например, "http://") или без него.
- Доменное имя может состоять из латинских букв, цифр и дефиса. Оно может содержать точки для разделения поддоменов.
- URL может содержать порт, указанный после двоеточия (например, ":8080").
- Путь может содержать латинские буквы, цифры, специальные символы и слэши.
- URL может содержать параметры, указанные после вопросительного знака (например, "?param=value").
- URL может содержать якорь, указанный после символа решетки (например, "#anchor").

На основе этих правил, мы можем создать регулярное выражение для поиска URL:

$pattern = '/^(https?://)?([a-z0-9-]+.)+[a-z]{2,6}([/w .-]*)*/?$/i';

Давайте разберем его по частям:

- /^ - начало строки.
- (https?://)? - необязательная группа, определяющая протокол "http://" или "https://".
- ([a-z0-9-]+.)+ - группа, определяющая доменное имя. Она может содержать латинские буквы, цифры и дефисы, а также точку, чтобы разделить поддомены. Знак "+" означает, что эта группа может повторяться несколько раз.
- [a-z]{2,6} - опциональная группа, указывающая на доменное расширение верхнего уровня, такое как .com, .org или .xyz.
- ([/w .-]*)* - группа, определяющая путь. Она может содержать латинские буквы, цифры, специальные символы ("/", ".", "-" и пробел) и повторяться несколько раз.
- /? - символ слэша, указывающий, что путь может или не может оканчиваться на слэш.
- $ - конец строки.

Флаг /i в конце регулярного выражения означает, что поиск должен быть регистро-независимым.

Для проверки URL с использованием данного регулярного выражения в PHP, можно воспользоваться функцией preg_match():

$url = "http://example.com";
if (preg_match($pattern, $url)) {
    echo "Правильный URL";
} else {
    echo "Неправильный URL";
}

Это основное регулярное выражение для поиска URL. Однако, стоит отметить, что оно не покрывает все возможные варианты, так как URL может иметь дополнительные параметры, заголовки и другие сложно учитываемые особенности. Если вам нужно более точное регулярное выражение, вы можете дополнить его или использовать готовые библиотеки для разбора URL.