Благодаря @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
.