2015-03-27 2 views
0

В настоящее время я получил несколько записей БД, которые выглядят следующим образом:Поиск URL в строке, заменить его и изменить HREF

1. This is some text http://www.sitehere.com more text 
2. Text https://www.anothersite.com text text text 
3. http://sitehere.com http://sitehereagain.com 
4. Just text here blabla 

Я пытаюсь фильтровать эти записи во время печати их и добавить на линии всасывания из всех urls http://anothersite.com/?. Также поставить новый URL-адрес назначения в качестве ссылки, но не сохранить исходный URL как текст:

text text <a href="http://anothersite.com/?http://sitehere.com">http://sitehere.com</a> text 

До сих пор мне удалось добавить http://anothersite.com/? часть со следующим кодом:

$result = preg_replace('/\bhttp:\/\/\b/i', 'http://anothersite.com/?http://', $input); 
$result = preg_replace('/\bhttps:\/\/\b/i', 'http://anothersite.com/?https://', $input); 

Но ahref является не так, как я этого хочу. Вместо этого это:

text text <a href="http://anothersite.com/?http://sitehere.com">http://anothersite.com/?http://sitehere.com</a> text 

PS: Я не ищу javascript-решение :) Спасибо!

ответ

1

Этот код должен работать. Есть несколько больших изменений, которые я сделал. Первый - я использую preg_replace_callback вместо preg_replace, поэтому я могу правильно закодировать URL-адрес и получить больше контроля над выходом. Другое изменение - это совпадение всего домена, поэтому функция обратного вызова может вставить URL-адрес между тегами <a>, а также добавить его в гиперссылку.

<?php 

    $strings = array(
     'This is some text http://www.sitehere.com more text', 
     'Text https://www.anothersite.com text text text', 
     'http://sitehere.com http://sitehereagain.com', 
     'Just text here blabla' 
    ); 

    foreach($strings as $string) { 
     echo preg_replace_callback("/\b(http(s)?:\/\/[^\s]+)\b/i","updateURL",$string); 
     echo "\n\n"; 
    } 

    function updateURL($matches) { 
     $url = "http://anothersite.com/?url="; 
     return '<a href="'.$url.urlencode($matches[1]).'">'.$matches[1].'</a>'; 
    } 

?> 
+0

Это выглядит потрясающе @ Давид. У меня только небольшая ошибка с окончательным URL: 'http: //anothersite.com/? Url = http% 3A% 2F% 2Fsitehereagain.com' – user3096206

+0

Вот как это должно быть. Вы должны закодировать параметр URL. Если URL-адрес в строке содержит '?' Или '&', он все испортит, но с помощью моего метода это безопасно. Когда вы запрашиваете значение $ _GET, это будет то, что вы ожидаете. – David

+0

Никогда не сомневайся, что Дэвид ошибся. Этот дополнительный 'url =' сделал цикл ссылок навсегда. Большое спасибо за потрясающее решение! – user3096206

Смежные вопросы