PHP正则表达式只提取不同字符串的部分

时间:2016-02-13 14:55:31

标签: php arrays regex string

我知道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.]+$

Regex101

1)正则表达式是否正确?

2)什么是正确的PHP函数用于额外的这些字符串的一部分?

我使用了preg_matchpreg_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));
        }
    }
?>

3 个答案:

答案 0 :(得分:2)

试试这个:

[a-z]+(?=\.pdf)

其中(?=\.pdf)是&#34; lookahead&#34;正则表达式,基本上选择一个或多个字母[a-z],如果 .pdf 之后

Regex101-1

如果您在 .pdf 旁边有其他扩展名,那么请使用此正则表达式,该正则表达式将使用前瞻和后备来抓取以 _开头的字符串后跟一个点 .

(?<=_)[a-z]+(?=\.)

Regex101-2

使用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)

Regex

_(?<your_group_name>[a-z]{1,2})\.

Regular expression visualization

Debuggex Demo

PHP

<?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)

虽然你已经接受了答案,但为什么不提出......就像这样简单:

:

对于您的代码,这将归结为:

Map/mapply

请参阅a demo on regex101.com