1

我希望有一个可以在文本中解析的函数,然后它将所有包含 (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" />

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

目前,我可以<img>使用以下正则表达式将图像 url 替换为标记:

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

并在下面替换普通的 url 来<a>标记:

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

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

谢谢你。

4

3 回答 3

1

抱歉回复晚了,我会尽快回复。

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

$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

于 2013-10-27T13:13:27.027 回答
0

我希望这就是你要找的

解决方案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
于 2013-10-26T09:47:18.030 回答
0

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

我建议改变这个:

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

对此:

~\b(?:https?|ftp|file):\/\/[^\s"'(){}<>|\\^~`]+~i
于 2019-04-18T10:26:23.890 回答