preg заменить проблемы гиперссылками


Прежде чем я решил опубликовать свой первый вопрос на StackOverflow, я стал совершенно сумасшедшим, так что вот он:

У меня есть сайт, который использует Google Calendar API для извлечения записей о событиях. В разделе Описание пользователи могут заполнить некоторые сведения о событии. Теперь я хотел бы, чтобы они могли вставлять гиперссылки. Это может произойти несколькими способами. Типы пользователей:

  • www.test.com
  • http(s)://test.com
  • http(s)://www.test.com
  • <a href="[one of above]" target="_blank">test.com</a>

То, что я Отчаянно ищу for-это способ преобразовать их все в формат <a href="[http:// OR https:// OR www.]test.com" target="_blank">test.com</a>

Я уже пробовал этот синтаксис:

$pattern = "/(?i)b((!<?:https?://|wwwd{0,3}[.]|[a-z0-9.-]+[.][a-z]{2,4}/)(?:[^s()<>]+|(([^s()<>]+|(([^s()<>]+)))*))+(?:(([^s()<>]+|(([^s()<>]+)))*)|[^s`!()[]{};:'".,<>?«»“”‘’]))/";
$description = preg_replace($pattern, "<a href='http://$1'>$1</a>", $description);

Он делает изменение всех событий в формате www.test.com в правильной гиперссылке он не изменяет события в формате http (S): / /www.test.com и http(s)://test.com ввод в формате <a href="[one of above]" target="_blank">test.com</a> превращается в беспорядок.

Теперь мне грустно и я устал. Если бы кто-то мог мне помочь, ты был бы абсолютным гением!
3 2

3 ответа:

Попробуйте заключить s в квадратные скобки:

$pattern = "/(?i)\b((!<?:http[s]?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))/";

Или:

$description = preg_replace('/(http[s]?:\/\/[^\s]*)/i', '<a href="$1">$1</a>', $description);

Вы можете использовать:

$input = preg_replace('/^(?:https?://)?((?:[\p{L}\p{N}-]+\.)+[\p{L}\p{N}-]+)\b/', 
      '<a href="http://$1" target="_blank">test.com</a>', $input);

Демонстрация Регулярных Выражений

Наконец-то решил его с условием в PHP: вот код, чтобы другие могли его использовать. Добавляет путь после .домен/ сейчас.
Большое спасибо за вашу помощь!

if (!stristr($description, '<a href')){
  $pattern = "~(?:https?://)?((?:[\\p{L}\\p{N}-]+\\.)+[\\p{L}-]{2,5})((\\S)*)~m";
  $description = preg_replace($pattern, "<a href=\"$0\" target=\"_blank\">$0</a>", $description);
}