Регулярное выражение для всех URL-адресов в строке, не захватывающих URL-адреса с вопросительным знаком

Я начинаю с этой строки PHP.

$bodyString = '
    another 1 body
    reg http://www.regularurl.com/home
    secure https://facebook.com/anothergreat.
    a subdomain http://info.craig.org/
    dynamic; http://www.spring1.com/link.asp?id=100408
    www domain; at www.wideweb.com
    single no subdomain; simple.com';

Необходимо превратить все домены, URL-адреса в элементы привязки (<a>).

preg_replace('#[-a-zA-Z0-9@:%_\+.~\#?&//=]{2,256}\.[a-z]{2,4}\b(/[-a-zA-Z0-9@:%_\+.~\#?&//=]*)?#si', '<a href = "$0">$0</a>', $bodyString)

$bodyString результат:

'another 1 body
    reg <ahref = "http://www.regularurl.com/home">http://www.regularurl.com/home</a>
    secure <a href = "https://facebook.com/anothergreat.">https://facebook.com/anothergreat.</a>
    a subdomain <a href = "http://info.craig.org/">http://info.craig.org/</a>
    dynamic; <a href = "http://www.spring1.com/link.asp">http://www.spring1.com/link.asp</a>?id=100408
    www domain; at <a href = "www.wideweb.com">www.wideweb.com</a>
    single no subdomain; <a href = "simple.com">simple.com</a>';

Результат: Все url, домены превращены в <a>Кромеhttp://www.spring1.com/link.asp?id=100408

Чего не хватает в регулярном выражении, чтобы эта работа работала?

Может быть, это поможет.

Wiktor Stribiżew 03.04.2018 15:36

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

Ashish Choudhary 03.04.2018 15:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
93
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий
$bodyString = '
    another 1 body
    reg http://www.regularurl.com/home
    secure https://facebook.com/anothergreat.
    a subdomain http://info.craig.org/
    dynamic; http://www.spring1.com/link.asp?id=100408
    www domain; at www.wideweb.com
    single no subdomain; simple.com';

$regex = '@(http)?(s)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@'; 
$converted_string = preg_replace($regex, '<a href = "$0">$0</a>', $bodyString);
echo $converted_string;

Демо

Регулярное выражение Описание здесь

[-\w@:%+.\~#?&/=]{2,256}\.[a-z]{2,4}\b[^\s]*

[^\s]* добавит в URL-адрес любой непробельный символ. Когда есть пробел, это не часть URL-адреса. Просто и легко.

рабочий url здесь

Основываясь на комментарии @ WiktorStribiżew, вы можете попробовать это:

[^\s]{2,256}\.[a-z]{2,4}\b(?:[?/][^\s]*)*

Испытание здесь

Примечание - Хотя на данный момент есть уже 2 ответа, это кажется более кратким, используя [^\s]

Объяснение -

[^\s]{2,256} соответствует от 2 до 256 символов, что является частью https://facebook и https://www.randomdomain,
\. соответствует точке после этого,
[a-z]{2,4} - это расширение домена, например: com, in и т. д.
\b - граница слова,
(?:[?/][^\s]*)* - это группа без захвата, которая соответствует либо косой черте /, либо вопросительному знаку ? и большему количеству URL-адресов, все из которых могут повторяться ноль или более раз, указывая подстраницы URL-адреса.

Чтобы лучше понять синтаксис регулярных выражений, вам следует попробуйте этот сайт: rexegg.com

Другие вопросы по теме