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

标签 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

我试图仅提取最后一个小写字符:cvbjacr

我正在使用以下正则表达式来尝试执行此操作:[a-z.]+$

Regex101

1) 正则表达式正确吗?

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

我已经使用了 preg_matchpreg_split,但我不确定我真正应该使用哪一个。我认为 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));
        }
    }
?>

最佳答案

试试这个:

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

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

Regex101-1


如果您除了 .pdf 之外还有其他扩展名,请使用此正则表达式,它将使用向前查找和向后查找来获取以 _< 开头的字符串 后跟一个点 .

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

Regex101-2


使用 PHP 获取所需的字符串:

PHP Fiddle - 点击“运行” 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
a
cr

关于PHP 正则表达式仅提取不同字符串的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35381347/

相关文章:

php - 如何从 PDO 中挤出错误消息?

php - 如何根据出生日期获得本月退休金

php - MySQL 高级选择查询检查另一个表中的数据

javascript - 使用迭代 2 个数组的循环将键/值添加到空对象中

regex - 检查字符串中是否只有空格

php - 尝试将一个大的多行文件 preg_split 成一个数组

JavaScript 验证问题

php - 与 PHP 的 SSH 连接

iOS核心数据: Fetch child Magical Record data

java - 解析 ArrayList 中的 ArrayList 不起作用。