Да, это определенно то, что вы хотите сделать на стороне сервера. Прежде всего, если вы принимаете пользовательский ввод, содержащий разметку HTML, вы должны очистить его с помощью хорошего фильтра HTML, такого как HTML Purifier . (Это также облегчит их ввод для более сложной разметки.)
Это должно быть выполнимым в пределах одного оператора preg_replace (), но я бы разбил его на что-то вроде этого:
$hrefPattern = '/<a[^>]+?href="(.+?)".*?>/i';
$outLink = 'http://mysite.com/external?url=';
$offset = 0;
while(preg_match($hrefPattern, $text, $hrefMatches, PREG_OFFSET_CAPTURE, $offset))
{
$hrefInner = $hrefMatches[1][0];
$offset = $hrefMatches[1][1];
echo $hrefInner . "\r\n";
if(strpos($hrefInner, '://') !== false)
{
$externalUrl = $outLink . rawurlencode($hrefInner);
$text = str_replace($hrefInner, $externalUrl, $text);
$offset += strlen($externalUrl);
}
}
Документация preg_match () объясняет это довольно хорошо. В основном мы просто ищем каждый тег <a ... href="">
, собираем его содержимое, переформатируем его, если он начинается с (anything)://
, и повторяем, пока в $text
не останется больше ссылок. Если вы переформатируете ссылку, вам нужно rawurlencode()
ссылка, которую вы удалили, чтобы убедиться, что новая ссылка действительна .
Способ, которым Facebook очищает контент для своих фрагментов ссылок, я бы предположил, намного сложнее, но да - вы бы хотели отправить запрос AJAX на страницу PHP, которая очищает данную ссылку и генерирует ее. любой фрагмент, который вы хотите. довольно немного больше вовлечено в это, хотя - вам придется обрабатывать, если страница не существует, перенаправляет на другую страницу, имеет недопустимую разметку, разные типы документов и т. Д.
Надеюсь, это поможет!