我正在尝试在PHP中匹配以下结构的文件。
输入:
filename.ext1
filename.ext1.ext2
filename.ext3.ext2.ext1
filename.ext4.ext2.ext1.ext4
file name with spaces and no way of knowing how long.ext1
file name with spaces and no way of knowing how long.ext1.ext2
file name with spaces and no way of knowing how long.ext2.ext1.ext3
file name with spaces and no way of knowing how long.ext3.ext1.ext4.ext3
输出:
filename
filename
filename
filename
file name with spaces and no way of knowing how long
file name with spaces and no way of knowing how long
file name with spaces and no way of knowing how long
file name with spaces and no way of knowing how long
我已经尝试过的(当然不起作用,我已经理解了原因):
^(?P<basename>.*)(\.ext4)|(\.ext3)|(\.ext2)|(\.ext1).*$
我想提取文件的基本名称并基本上删除所有扩展名,因为无法知道它们可能出现的顺序。我尝试了几种解决方案,但它们对我不起作用。扩展名可以是任何长度的字母数字。
我对正则表达式相当新,我很困惑,显然你不能简单地搜索到第一个点并将其删除,包括之后的所有内容。
要学习,我也很想知道如何反向,只是匹配所有扩展,包括第一个点。
更新
我没想到包含点的文件名。显然,我对“向前搜索”的看法存在缺陷。有没有人有案例的解决方案
file name with spaces and no. way of knowing how long.ext3.ext1.ext4.ext3
甚至
file name with spaces and no way of knowing.how.long.ext3.ext1.ext4.ext3
后者很可能仅在给出某些扩展时起作用。所以请假设ext1-4已经给出但是处于不可预测的序列中。
答案 0 :(得分:1)
又快又脏:
preg_replace("/\.(ext1|ext2|ext3|ext4)/i", "", $filename)
答案 1 :(得分:0)
没有必要为此使用正则表达式; PHP具有用于
的buildin函数basename()
答案 2 :(得分:0)
这样简单的事情对你有用......
^[^.]*
基本上它只是匹配第一个点之前的字符串。
答案 3 :(得分:0)
很困惑,显然你不能简单地搜索到第一个点并删除它,包括之后的所有内容。
由于从左到右读取正则表达式,因此查找单个点将直接指向第一个点。也就是说,您可以使用:
preg_replace("/\..*/", "", $filename);
.*
匹配除换行符之外的任何字符。
如果文件名有点,这显然不起作用,因为部分文件名将被删除。
根据更新,如果您有特定的扩展名,则可以使用以下内容:
preg_replace("/(?:\.ext[1-4])+$/m", "", $filename);
从更广泛的角度来看,如果你的处置有一系列扩展,你可以使用这样的东西:
$exts = array(".ext1", ".ext2", ".ext3", ".ext4");
$result = preg_replace("/(?:". preg_quote(join("|",$exts)) .")+$/m", "", $filename);
答案 4 :(得分:0)
答案 5 :(得分:0)
.*(?=\.)
试试这个?即使文件名中有一个点
,也会匹配最后一个点之前的所有点答案 6 :(得分:0)
这很简单,只需简单的旧PHP功能。不需要花哨的正则表达式。
$name = substr($filename, 0, strpos($filename, '.'));
这对于有文件名的文件名不起作用。就像你更新的例子一样,但为了达到这个目的,你可能需要提前知道你可能遇到的扩展。