我知道Stackoverflow上有很多正则表达式问题,我一次又一次地研究了我的代码,但作为正则表达式和PHP的新手,我只是不明白。我有一个文件名列表,如
1000032842_WMN_2150_cv.pdf
1000041148_BKO_111_SY_bj.pdf
000048316_ED_3100_AMW_2_a.pdf
1000041231_HF_210_WPO_cr.pdf
我正在尝试仅提取最后一个小写字符: cv
, bj
, a
, cr
我正在使用以下正则表达式尝试执行此操作:[a-z.]+$
1)正则表达式是否正确?
2)什么是正确的PHP函数用于额外的这些字符串的一部分?
我使用了preg_match
,preg_split
,但我不确定应该使用哪一个。我 THINK preg_split
是正确的功能。
$url = "1000036112_GKV_35_VM_32_a.pdf";
$url = preg_split('/[a-z.]+$/', $url);
print_r ($url);
但 [1]
为空。
Array ( [0] => 1000036112_GKV_35_VM_32_ [1] => )
更新编辑
以下给出了int 0,int 1等的列表
<?php
$filename = "urls.csv";
$handle = fopen($filename, "r");
if ($handle !== FALSE) {
while (($data=fgetcsv($handle,99999,',')) !== FALSE) {
$url = $data[1];
var_dump (preg_match_all('/_([a-z]{1,2})\./', $url));
}
}
?>
答案 0 :(得分:2)
试试这个:
[a-z]+(?=\.pdf)
其中(?=\.pdf)
是&#34; lookahead&#34;正则表达式,基本上选择一个或多个字母[a-z]
,如果 .pdf
之后
如果您在 .pdf
旁边有其他扩展名,那么请使用此正则表达式,该正则表达式将使用前瞻和后备来抓取以 _
开头的字符串后跟一个点 .
(?<=_)[a-z]+(?=\.)
使用PHP获取所需的字符串:
PHP Fiddle - 点击&#34;运行&#34; 或 F9 以查看结果
$urls = array('1000032842_WMN_2150_cv.pdf', '1000041148_BKO_111_SY_bj.pdf', '000048316_ED_3100_AMW_2_a.pdf', '1000041231_HF_210_WPO_cr.pdf');
foreach($urls as $url) {
if (preg_match('/(?<=_)[a-z]+(?=\.)/i', $url, $match)) {
echo $match[0].'<br>';
}
}
输出:
CV
BJ
一个
CR
答案 1 :(得分:1)
_(?<your_group_name>[a-z]{1,2})\.
<?php
$matches = array();
preg_match_all(
'/_([a-z]{1,2})\./',
"1000032842_WMN_2150_cv.pdf
1000041148_BKO_111_SY_bj.pdf
000048316_ED_3100_AMW_2_a.pdf
1000041231_HF_210_WPO_cr.pdf",
$matches
);
var_dump($matches);
?>
array(2) {
[0]=>
array(4) {
[0]=>
string(4) "_cv."
[1]=>
string(4) "_bj."
[2]=>
string(3) "_a."
[3]=>
string(4) "_cr."
}
[1]=>
array(4) {
[0]=>
string(2) "cv"
[1]=>
string(2) "bj"
[2]=>
string(1) "a"
[3]=>
string(2) "cr"
}
}
答案 2 :(得分:1)