【问题标题】:Find & replace url to HTML tag using regular expression使用正则表达式查找和替换 url 到 HTML 标记
【发布时间】:2013-11-05 11:20:13
【问题描述】:

我希望有一个可以在文本中解析的函数,然后它将所有包含 (jpg|png|gif|jpeg|bmp) 扩展名的链接替换为<img> 标签,之后它还将替换所有其他不带 (jpg|png|gif|jpeg|bmp) 扩展名且带有 <a> 标签的链接。

例如它应该替换:

http://imgur.com/gallery/TpGvHBL http://i.imgur.com/TpGvHBL.jpg

<a href="http://imgur.com/gallery/TpGvHBL" target="_blank">http://imgur.com/gallery/TpGvHBL</a> <img src="http://i.imgur.com/TpGvHBL.jpg" />

================================================ ==============================

目前我可以使用下面的正则表达式将图片 url 替换为 <img> 标签:

$text = preg_replace('#((https?|ftp):\/\/([^\s]*)\.(jpg|gif|png))#', '<img src="$1" />', $text);

以及下面将普通网址替换为<a>标签:

$text = preg_replace('/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/i', '<a href="$1" target="_blank">$1</a>', $text);

我想要的是更改第二个正则表达式以仅替换非图像 url,因为它会与我的第一个正则表达式冲突。

谢谢。

【问题讨论】:

  • 你试过什么? Stackoverflow 不是获取现成代码的免费服务。试试看,我很乐意提供帮助。提示:1)尝试将 url 与这些扩展匹配 2)将这些 url 保存在一个数组中 3)循环遍历该数组,删除那些扩展 4)循环遍历数组(不带扩展)并尝试进行一些正则表达式替换,使用 @987654329 @ 防止错误匹配 5) 享受
  • 嗨@HamZa,实际上我正在寻找一种可以直接替换文本中所有url而不是使用数组的解决方案,但是,我已经用我尝试过的代码进行了更新,请给我一些建议。谢谢!

标签: php html regex preg-replace expression


【解决方案1】:

@hamza's RegExp 遗漏了一些不能属于 URL 的符号,例如引号、括号等。

我建议改变这个:

~\b(?:https?|ftp|file)://\S+~i

到这里:

~\b(?:https?|ftp|file):\/\/[^\s"'(){}<>|\\^~`]+~i

【讨论】:

  • @bummi 不幸的是,这是我在这里的第一个答案,我没有足够的声誉将 cmets 放到其他人的答案中。我只能提出新的答案:(
  • 让它成为一个独立的答案(提到 hamza)。就目前而言,它是答案部分中的评论,可能会被删除。
【解决方案2】:

抱歉回复晚了,我马上回复。

所以这是我想出的解决方案:

$string = 'some test http://imgur.com/gallery/TpGvHBL http://i.imgur.com/TpGvHBL.jpg something else ...';

$result = preg_replace_callback('~\b(?:https?|ftp|file)://\S+~i', function($v){
    if(preg_match('~\.jpe?g|\.png|\.gif|\.bmp$~i', $v[0])){ // if image
        return '<img src="' . $v[0] . '">';
    }else{
        return '<a href="' . $v[0] . '" target="_blank">' . $v[0] . '</a>';
    }
}, $string);

我想匹配所有 url,然后检查是否有图像扩展名。当然,第一个正则表达式非常松散,您可以改进它...请注意,您需要 PHP 5.3+,因为我使用的是匿名函数。

正则表达式解释:

~                   # delimiter
    \b              # word boundary
    (?:             # start of a non-capturing group
        https?      # match http or https
        |           # or
        ftp         # match ftp (you may want to add sftp o_O ?)
        |           # or
        file        # match file
    )               # end of the non-capturing group
    ://             # match ://
    \S+             # match anything except whitespace one or more times
~                   # delimiter, end of expression
i                   # set the i modifier : match case-insensitive

第二个正则表达式~\.jpe?g|\.png|\.gif|\.bmp$~i 仅匹配字符串末尾的以下扩展名jpg, jpeg, png, gif and bmp

【讨论】:

  • 大声笑我从来不知道有一个 preg_replace_callback 函数,感谢您指出它,它完美地工作!非常感谢!
【解决方案3】:

我希望这就是你要找的东西

解决方案 1:

<?php
$str="http://imgur.com/gallery/TpGvHBL http://i.imgur.com/TpGvHBL.jpg";
$new_str=explode(" ",$str);
$str="<a href=".$new_str[0]." target=_blank>".$new_str[0]."</a>";
$str.=" <img src=".$new_str[1]." />";
echo htmlentities($str);

输出:

<a href=http://imgur.com/gallery/TpGvHBL target=_blank>http://imgur.com/gallery/TpGvHBL</a> <img src=http://i.imgur.com/TpGvHBL.jpg />

解决方案 2:

<?php
//$str='http://imgur.com/gallery/TpGvHBL';
$str='http://i.imgur.com/TpGvHBL.jpg';
if(is_array(getimagesize($str)))
{
echo "Image<br>";
    $str="<img src=".$str." />";
}
else
{
    echo "Link<br>";
    $str="<a href=".$str." target=_blank>".$str."</a>";
}
echo htmlentities($str);

输出:

Image
http://i.imgur.com/TpGvHBL.jpg

【讨论】:

  • 他在寻找正则表达式 ;)
  • 是的@demonking 是对的,我正在寻找正则表达式来替换整个文本的网址,无论如何感谢您的回复。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 2015-07-20
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
相关资源
最近更新 更多