【问题标题】:Validate img url with Regular Expression使用正则表达式验证 img url
【发布时间】:2014-05-18 22:09:03
【问题描述】:

我一直在尝试使用正则表达式验证图像 url,如下所示:

#\[img\](((http:\/\/|https:\/\/)?(www.)?(([a-zA-Z0-9-]){2,}\.){1,4}([a-zA-Z]){2,6}(\/([a-zA-Z-_\/\.0-9#:?=&;,]*)?)?))\[\/img\]#iUs

我希望能够替换:

[img]http://www.website/folders/url_here.png[/img]
[img]https://www.website/folders/url_here.jpg[/img]
[img]https://www.website/folders/url_here.gif[/img]

与:

<img src="http(s):www.website/folders/url_here.png(jpg, gif)" />

使用:

$new_string = preg_replace($search, $replace, $string);

谢谢!

【问题讨论】:

    标签: javascript php regex


    【解决方案1】:

    类似这样的:

    <?php
    
    $rgx = '/\[img\](https?:\/\/.+?\.(?:png|gif|jpg))\[\/img\]/';
    $arr = array(
    'sdvsvsdvsdv[img]http://www.website/folders/url_here.png[/img]sdvsdvsvdsvdsdv',
    'sdvsvdsvd[img]https://www.website/folders/url_here.jpg[/img]svsnvlkn',
    'sdvsdvsdv[img]https://www.website/folders/url_here.gif[/img]svdsvd'
    );
    
    $all = 'sdvsvsdvsdv[img]http://www.website/folders/url_here.png[/img]sdvsdvsvdsvdsdv
    sdvsvdsvd[img]https://www.website/folders/url_here.jpg[/img]svsnvlknsdvsdvsdv[img]https://www.website/folders/url_here.gif[/img]svdsvd';
    
    echo "Individual strings:\n";
    foreach ($arr as $str) {
        echo preg_replace($rgx, '<img src="$1" alt="">', $str) . "\n";
    }
    
    echo "\nAll together: \n";
    echo preg_replace($rgx, '<img src="$1" alt="">', $all) . "\n";
    

    键盘: http://codepad.org/n00B6akn

    一些小调整:

    或者,这个调整通过保持贪婪而不是使中间非贪婪来加速我制作的正则表达式:

    $rgx = '/\[img\](https?:\/\/[^\[]*\.(?:png|gif|jpg))\[\/img\]/'
    

    这里没有那么多斜线:

    $rgx = '~\[img\](https?://[^\[]*\.(?:png|gif|jpg))\[/img\]~'
    

    它确保 img 标签匹配,并且它们之间的任何内容都以 http(s):// 开头并以 .png / .gif / .jpg 结尾。如果您需要更好的验证,那么像 hwnd 最初所做的(他的答案的 v1)更合适(假设您根据自己的需要调整他的解决方案)。

    【讨论】:

    • 你可以通过使用不同的分隔符来消除那里的一些斜线,就像 Livewire 所做的那样,我使用了一个编辑器/测试器,其中斜线是强制性的,所以我没有那么奢侈。
    【解决方案2】:

    您可以为此使用以下内容。

    $text = <<<DATA
    [img]http://www.website/folders/url_here.png[/img]
    [img]https://www.website/folders/url_here.jpg[/img]
    [img]https://www.website/folders/url_here.gif[/img]
    DATA;
    
    $text = preg_replace('~\[(img)\](https?://\S+\.(?:png|gif|jpg))\[/\1\]~', 
                         '<img src="$2" />', $text);
    

    输出

    <img src="http://www.website/folders/url_here.png" />
    <img src="https://www.website/folders/url_here.jpg" />
    <img src="https://www.website/folders/url_here.gif" />
    

    Live demo

    【讨论】:

    • 这看起来也很棒,谢谢,我会检查两个答案。
    • 我很佩服你不遗余力地验证 url 但FILTER_VALIDATE_URL 只正确匹配 ascii url 并且还允许除 http 和 https 以外的协议,只是不得不提一下。
    【解决方案3】:

    你会想要使用类似的东西:

    $output = preg_replace('/\[img\]((?:https|http|ftp):\/\/.+?\.(?:png|gif|jpg))\[\/img\]/igm', '<img src="$1" alt="Image">', $input);
    

    $input 是您的文本页面,$output 是您的结果。正则表达式计算 url 和 bbcode,然后将其添加到标签中。我添加了 alt="" 属性只是为了使其对 html 更有效。我还允许使用 ftp 协议,因为某些 ftp 服务器允许公共访问图像文件。

    /igm 使其不区分大小写,允许后续搜索从前一个匹配项的结尾开始,并将匹配一行的开头和结尾,而不是整个字符串的开头和结尾。

    【讨论】:

    • 这不会验证 URL 是否有效
    • @hwnd 我希望它可以是可选的,因为某些网站使用 https
    • 就验证而言,您问题中的网址无效。
    • @user2444411 首先,您的http(s):www.website/folders/url_here.png(jpg, gif) 网址无效。但我在这里应该终于可以工作了。
    • @limewire 好吧,我把括号作为选项表示它可以是 https 或 http 等图像类型。
    猜你喜欢
    • 2021-02-24
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2015-09-07
    • 2013-08-24
    • 2011-07-30
    • 1970-01-01
    相关资源
    最近更新 更多