2017-06-22 29 views
-1

我正在尝试使文件名格式的正则表达式看起来像这样;需要正则表达式来从文件名读取产品SKU和其他数据

B2B_1111108A20.jpg 
B2B_1111108A20_1.jpg 
B2B_1111108A20_2_S.jpg 
B2B_1111108A20_3_ST.jpg 

,然后做一个到的preg_match分割数据,因为我需要阅读SKU产品作为文件名中包含它。在取得SKU后,我会完成其余的逻辑。

我想这正则表达式:

^B2B_.*(_([0-9]+))?(_([A-Za-z]+))?$ 

它确实返回匹配的文件名,但数据永远不会与的preg_match功能拆分。相反,我得到了全名。凡为我期待的结果是这样的(这取决于文件名如上所述):

$result[0] = B2B_1111108A20 
$result[1] = B2B_1111108A20 
$result[2] = _1 
$result[3] = 1 
+0

你可以尝试测试正则表达式在一个像?:https://regex101.com/ – Nicarus

+0

使用'preg_match_all'匹配所有字符串 – anubhava

+0

@Nicarus我已经尝试过我的正则表达式,但不是专门在工具regex101上。 com – Capri82

回答

0

的主要问题是.*。这是贪婪的,所以基本上会吃掉一切。既然你的分组有?,他们基本上会被忽略,因为量词是贪婪的。删除它可以解决您的部分问题。该$也使得因为你的线条没有任何意义结束与.jpg

至于.*的也许不是什么使用[^_.]

所以整体的正则表达式的样子:^B2B_[^_.]*(_([0-9]+))?(_([A-Za-z]+))?

https://regex101.com/r/HzZymV/2

+0

您提供的正则表达式与文件名匹配,但preg_match或preg_match_all函数不会返回正确的结果。例如。对于B2B_1111108A20_1.jpg preg_match返回数组[0] = B2B_1111108A20_1,数组[1] = _1,数组[2] = 1。这与我想要的不同。如果索引1不包含正确的名称,但至少索引0在所有情况下都只应具有值B2B_1111108A20,那就好了。 – Capri82

+0

不可能,索引0将始终是完整的正则表达式字符串。如果你只想要第一部分,然后做第一部分的子组。这意味着索引1将成为你想要的部分,其他所有的索引都将被索引1所以只需改变为'(B2B _ [^ _] *)' –