Обнаружение и редактирование внешних ссылок - PullRequest
3 голосов
/ 28 июля 2011

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

Проблема: я разрабатываю функцию, аналогичную Facebook: пользователь может опубликовать текстовое сообщение, которое может содержатьКоличество ссылок, они могут или не могут быть помещены в теги привязки, и могут иметь разные протоколы (http, https, ftp, ....)

Мне нужно

  1. обнаруживает эти ссылки и, возможно, пытается получить их (как в Facebook).Я думаю, что это задача для jquery?

  2. Мне также нужно надежно обнаружить внешние ссылки и изменить их на mysite.com/external?url=thelink.Который, я полагаю, является этой задачей для php (так как я не могу доверять входным данным, поступающим со стороны клиента, верно?)кажется не очень надежным использовать DOM-парсер (или я ошибаюсь)?Я нашел в Интернете простое регулярное выражение (я ужасен с регулярным выражением, кстати), которое, я думаю, я могу использовать (добавив намного больше протоколов)

    $strText = preg_replace( '/(http|ftp)+(s)?:(\/\/)((\w|\.)+)(\/)?(\S+)?/i', '<a href="\0">\4</a>', $strText );  
    

    Могут ли некоторые эксперты, которые имеют опыт в этомЗадача, пожалуйста, укажите мне правильное направление?

1 Ответ

1 голос
/ 28 июля 2011

Да, это определенно то, что вы хотите сделать на стороне сервера. Прежде всего, если вы принимаете пользовательский ввод, содержащий разметку 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, которая очищает данную ссылку и генерирует ее. любой фрагмент, который вы хотите. довольно немного больше вовлечено в это, хотя - вам придется обрабатывать, если страница не существует, перенаправляет на другую страницу, имеет недопустимую разметку, разные типы документов и т. Д.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...