Intereting Posts
PHP, Недопустимые символы в декодировании JSON PHP Send Email Содержит HTML Алгоритм Class Scheduling для наилучшего соответствия критериям? WideImage – Прозрачные области конвертированного PNG должны быть белыми Laravel 5.2 Пробный тест загрузки загруженного файла PHP mysql_real_escape_string () -> stripslashes (), оставляющий множественные слэши Чтение RAW-данных из запроса Flash POST (изображения) Недостаточно памяти (выделено 50855936) (попытался выделить 50331646 байт) Возврат ключей, если 3 соседних значения соответствуют PHPMailer отправляет электронные письма с предупреждением: это сообщение может и не отправляться: foo@gmail.com Подробнее Неустранимая ошибка: вызов функции-члена toOptionArray () Лучшая практика для HTML-заголовка в PHP Неопределенный метод для mock-объекта, реализующего данный интерфейс в PHPUnit? redirect Правила доступа с Yii Мой div при нажатии не отправляет форму внутри него с помощью js

PHP: замена абсолютных URL-адресов в текстовом поле

Благодаря @Mihai Stancu у меня появилась функция, которая заменяет относительные URL-адреса на абсолютные URL-адреса. Я улучшил его, поэтому он делает это для значений href и src.

У меня есть один домен с одним календарем, и я переношу некоторые из событий в другой домен, где я тоже использую эти события. У меня есть оба домена, поэтому нет риска для безопасности при создании абсолютных URL-адресов.

Но функция имеет ошибку – также она заменяет абсолютные ссылки, поэтому http://www.example.com/ … становится http://www.example.net/http://www.example.com/ … Вы можете помочь?

Не стесняйтесь улучшать функцию, если хотите 🙂

<?php $domain = 'http://www.example.net/'; // notice the domain has an end slash $textarea = 'tester afadf adf <a href="http://www.example.com/folder1/page1.html">do not replace this</a> ... bla bla <a href="/folder2/page2.html">do replace this url</a> bla bla.... <img src="http://www.example.com/somefolder/somepic.jpg" /> <img src="/somefolder/somepic.jpg" />'; $tags = array("href", "src"); foreach ($tags as $tag) { $textarea = preg_replace('/'.$tag.'\s*=\s*(?<'.$tag.'>"[^\\"]*"|\'[^\\\']*\')/e', 'expand_links($tag, $domain, "$1")', $textarea); } function expand_links($tag, $domain, $link) { return($tag.'="'.$domain.trim($link, '\'"/\\').'"'); } echo $textarea; ?> 

Глаза все еще кровоточат из регулярного выражения.

Как насчет DOMDocument? 🙂

 $domain = 'http://www.example.net/'; // notice the domain has an end slash $textarea = 'tester afadf adf <a href="http://www.example.com/folder1/page1.html">do not replace this</a> ... bla bla <a href="/folder2/page2.html">do replace this url</a> bla bla.... <img src="http://www.example.com/somefolder/somepic.jpg" /> <img src="/somefolder/somepic.jpg" />'; // wrap fragment into a full HTML body first (making sure the content type is set properly) $full_doc = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head><body>' . $textarea . '</body></html>'; $d = new DOMDocument; libxml_use_internal_errors(true); // muffle any errors from libxml $d->loadHTML($textarea); libxml_clear_errors(); // clear the errors found $x = new DOMXPath($d); // find all tags with either href or src attribute foreach ($x->query('//*[@href|@src]') as $e) { $attr = $e->getAttributeNode('href') ?: $e->getAttributeNode('src'); if (!preg_match('#^(?:https?://|mailto:)#', $attr->nodeValue)) { // not absolute $attr->nodeValue = $domain . $attr->nodeValue; } } echo $d->saveHTML(); 

Отказ от ответственности: это возвращает целый HTML-документ вместо фрагмента; если вам нужен фрагмент, вместо этого вы можете вызвать saveHTML в теге body .