2017-02-03 5 views
0

Я работаю над некоторым кодом, и я сделал достаточно работы, чтобы что-то сделать. Я хочу заменить URL-адрес изображения и веб-ссылки внутри этого текста.Php preg_match и preg_replace текст с url и тегами изображения

EG «Это мой текст с http://www.google.com и некоторые изображения http://www.somewebimage.png»

Заменить на «Это мой текст с <a href="http://www.google.com">http://www.google.com</a> и некоторые изображения <img src="http://www.somewebimage.png">»

Мой хак получает меня заменить URL (s) или IMG ссылки, но не both..one будет перезаписана из-за того,

$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/"; 
$reg_exImg = '/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?(jpg|png|gif|jpeg)/'; 
$post = "This is my text with http://www.google.com and some image http://www.somewebimage.png"; 

if(preg_match($reg_exImg, $post, $img)) { 
    $img_post = preg_replace($reg_exImg, "<img src=".$img[0]." width='300' style='float: right;'> ", $post); 
} else { 
    $img_post = $post; 
} 
if(preg_match($reg_exUrl, $post, $url)) { 
    $img_post = preg_replace($reg_exUrl, "<a href=".$url[0]." target='_blank'>{$url[0]}</a> ", $post); 
} else { 
    $img_post = $post; 
} 

Если я заблокировать блок кода $ reg_exUrl я получаю ссылку на изображение, если оно бежит я получаю ссылку URL.

+0

Что я пытаюсь сделать, это просто корм, где URLs ссылки и IMG URLs встраиваются .. –

+0

Первое, тестирование модели с 'preg_match' перед использованием его с' preg_replace' бесполезен. –

+0

Вы должны использовать один шаблон для двух случаев, а затем выбрать заменяющую маску с помощью 'preg_replace_callback'. Таким образом, все делается за один проход, и ничего не перезаписывается. В функции обратного вызова вы можете использовать 'parse_url' и' explode', чтобы легко извлечь расширение файла. –

ответ

0

Вы можете сделать это за один проход, ваши два шаблона очень похожи, и легко создать шаблон, который обрабатывает два случая. Используя preg_replace_callback, вы можете выбрать строку замены в функции обратного вызова:

$post = "This is my text with http://www.google.com and some image http://www.domain.com/somewebimage.png"; 

# the pattern is very basic and can be improved to handle more complicated URLs 
$pattern = '~\b(?:ht|f)tps?://[a-z0-9.-]+\.[a-z]{2,3}(?:/\S*)?~i'; 
$imgExt = ['.png', '.gif', '.jpg', '.jpeg']; 
$callback = function ($m) use ($imgExt) { 
    if (false === $extension = parse_url($m[0], PHP_URL_PATH)) 
     return $m[0]; 

    $extension = strtolower(strrchr($extension, '.')); 

    if (in_array($extension, $imgExt)) 
     return '<img src="' . $m[0] . '" width="300" style="float: right;">'; 
    # better to do that via a css rule --^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    return '<a href="' . $m[0] . '" target="_blank">' . $m[0] . '</a>'; 
}; 

$result = preg_replace_callback($pattern, $callback, $post); 
+0

Работал отлично, Да, я знал, что есть только один простой способ сделать это, просто не смог его получить ... Утреннее кодирование ... –

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

  • Нет связанных вопросов^_^