文件扩展名的正则表达式

8

我想知道是否有一种正则表达式可以使用基本的HTML来查找文件扩展名。

目前我有

<img src="images/pimage/{$item['item_id']}/small.jpg">

问题是并非我的所有图片都以.jpg结尾。因此,我希望有一个正则表达式能够找到所有以small开头且以.jpg,.jpeg,.JPG,.png,.gif等结尾的图片,不区分大小写。是否有一个简单的正则表达式可以在“small”之后使用来查找所有匹配的文件?
我不确定我做错了什么,但当我尝试任何建议时,输出只显示正则表达式而不是预期的结果。这是我当前的代码。
        function print_item($item,$link_change){
        $acticon= ($item['active']==TREEMAN_ITEM_ACTIVE)? 'active.gif' : 'disabled.gif';
        $tmpl_act=($this->section->webmode)? "<td><img src=\"".ADMIN_IMG_PATH."icons/{$acticon}\"></td>" : "";
        $tmpl_date=date('Y-m-d H:i',$item['cdate']);
        $tmpl_added_by=$item['added_by'];
        $tmpl_modified_by=$item['modified_by'];
//      $tmpl_date_mod=date('Y-m-d H:i',$item['timestamp']);
        $tmpl_date_mod=$item['timestamp'];
        $res=<<<EOT
<td >{$item['item_id']}</td>
<td><a href="{$link_change}"</a><img src="/img/ucart/images/pimage/{$item['item_id']}/small.jpg" height="75" width="75"</td>
<td class="tb" width="50%"><a href="{$link_change}" title="Edit item">{$item['item_name']}</a></td>
<td>$tmpl_date</td>
<td>$tmpl_date_mod</td>
<td>$tmpl_added_by</td>
<td>$tmpl_modified_by</td>
$tmpl_act
EOT;

有什么想法我做错了什么吗?


1
请澄清一下,您是要返回文件名 small-filename.jpg 还是一个正则表达式来获取完整的文件路径,例如 images/pimage/27/small-filename.jpg - femmestem
所有文件名都是小写的。有些是small.jpg,有些是small.JPG,small.png,small.gif等等... - Robert
3个回答

7
捕获以“small”开头并以您列出的任何扩展名结尾的所有图像的正则表达式: /^small.*\.(jpe?g|gif|png|tiff)$/i 术语解释: ^ - 开始 .* - 匹配 0 或多个任意字符 \. - 匹配句号;\ 是转义字符,表示下一个字符应该按原义解释,否则在正则表达式中这些字符 ., ?, + 等就有其他含义。 (a|b|c) - 匹配圆括号内的任何值(例如,如果下一个字符为 abc 则匹配) ? - 表示前一个字符可能出现零次或一次(例如,jpe?g 可匹配 "jpeg",因为它包含一个 'e',也可以匹配 "jpg",因为 'e' 在该位置上出现零次)。 $ - 表示要匹配的模式的结尾 /your-regex-pattern/i - 不区分大小写(匹配大写和小写字母)
如果您想了解有关正则表达式中的模式匹配的更多信息,请查看此实用程序“cheatsheet”:http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

如果文件名中包含扩展名前的其他句号(例如small.heart.png),则会失败,即使它是一个有效的文件名。此外,结尾应该是(jpg|jpeg|gif|png|tiff)(使用括号,而不是方括号)。最后,你可能会明智地在模式结尾处指定$,以确保没有任何字符跟在所谓的文件扩展名之后(例如,您当前的模式将成功匹配像 small.jpg.php 这样的内容,或者是任何跟着有效的图像扩展名的文件)。 - Spencer D
@SpencerDoak 感谢你发现了“[]”与“()”之间的区别。至于文件名边缘情况,我完全同意你的看法,但我没有考虑到这些情况,因为OP已经给出了文件名的大致样式。 - femmestem
3
另外一件事,"jpg|jpeg" 可以缩写为 "jpe?g"。 - Gary

3
也许这能帮到你?
/\.\w+$/

(输入字符串末尾的点号和1个或多个单词类字符)
或者
/\.[a-z]+$/i 
/\.[a-zA-Z]+$/

(输入字符串末尾的点号和1个或多个字母)

或者

/\.[a-z]{1,4}$/i
/\.[a-zA-Z]{1,4}$/

(以输入字符串结尾的点号和1到4个字母)

请注意,所有选项的输出中都有一个点号。
所有正则表达式都是不区分大小写的,因为有一个 i 标记。


另外,不幸的是,JavaScript 不支持向后查找,因此正则表达式

/(?<=small\.)[a-z]+/i

(在 small. 子字符串后面有1个或多个字母)

这个不起作用;但是我认为,在这种情况下,这将是最好的正则表达式。


0
根据来自www.Regular-Expressions.info的此页面,大小写敏感性和其他类似的匹配标志/选项通常是在编程语言中实现而不是直接在模式本身中实现。然而,在语言没有提供传递匹配标志/选项的选项的情况下,上面链接的RegEx信息页面表示可以在模式中指定诸如不区分大小写之类的选项。
要将模式指定为不区分大小写,可以将(?i)指定为不区分大小写部分的开始,将(?-i)指定为不区分大小写部分的结束。
对于您特定的情况,这意味着以下RegEx模式可能是有效的:\.(?i)(png|gif|jpg|jpeg|ico|bmp|svg|tiff)(?-i)$ 显然,您需要根据需要修改此模式以添加或删除图像文件类型。
在这个模式中: \。 表示文字句点字符( .); (?i)关闭大小写敏感性的所有后续部分; (png | gif | jpg | jpeg | ico | bmp | svg | tiff)表示选项列表,意味着文件扩展名必须是列表中的一个(且仅一个)选项; ( - i)开启大小写敏感性; 而$则标志着字符串的结尾,这意味着文件扩展名后面不能有任何字符。
如果您使用的语言支持以其他方式指定匹配标志,则建议您按照语言推荐的方式指定它们; 但是根据我上面链接的RegEx信息页面,这是指定它们在模式内的正确方式( 如果您决定向模式添加更多内容,它还具有不使整个模式不区分大小写的好处)。

编辑:作为警告,看起来JavaScript不支持在模式中打开和关闭区分大小写(使用(?i)(?-i))。因此,如果您正在使用JavaScript,则必须通过在表达式末尾设置/i标志或使用以下模式来解决问题:\.([pP][nN][gG]|[jJ][pP][eE]?[gG]|[gG][iI][fF]|[iI][cC][oO]|[tT][iI][fF]{1,2})$。在此模式中,扩展名中的每个字母都以大写和小写表示。这允许该模式匹配文件扩展名,无论它是以什么大小写形式编写的,同时仍然允许表达式的其余部分区分大小写。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接