从末尾查找字符串模式


Find string pattern from end

我正在尝试查找字符串的格式是否为<initial_part_of_name>_0.pdf,即

  1. 查找它是否以.pdf结束(可以使用rtrim消除)
  2. 初始部分后面跟着一个_下划线
  3. 下划线后面跟一个整数(0、1、2、…等)

实现这一目标的最佳方式是什么?我尝试了字符串函数strpos的组合(以查找位置。但无法从字符串末尾执行任何操作)
任何建议都将不胜感激!

编辑:
示例字符串:
public://Big_Data_Tutorial_part4_0.pdf
public://Big_Data_Tutorial_part4_1.pdf
public://Big_Data_Tutorial_part4_3.pdf
我需要检查的原因是为了避免附加_<number>存储的重复文件。

您可以使用preg_match()函数来匹配图案

检查函数preg_match()

preg_match("/(.*)_('d+)'.pdf$/", "<initial_part_of_name>_0.pdf",$arr);

$arr[1]中,您将获得<initial_part_of_name>

$arr[2]中,您将获得下划线

后的数字

非数组和正则表达式方式

$str1 = "public://Big_Data_Tutorial_part4_0a.pdf"; // no match because 0a
$str2 = "public://Big_Data_Tutorial_part4_1.pdf"; // match
$str3 = "public://Big_Data_Tutorial_part4_3.pdf"; // match

$last_part = strrchr($str1, "_");
if (trim(strstr($last_part, ".", true), "_0..9") == "" && strstr($last_part, ".") == ".pdf") {
    echo "match";
}
$str = '<initial_part_of_name>_0.pdf';
$exploded = explode('.', $str);
echo $exploded[1];

这可以使用regex来完成。类似的东西

^[0-9A-Za-z]+'_['d]'.pdf$

实施:

$filename = '<initial_part_of_name>_0.pdf';
if(preg_match('/^[0-9A-Za-z]+'_['d]'.pdf$/i', $filename)){
    // name pattern Matched
}

解决方案2

使用pathinfo()

$filename = '<initial_part_of_name>_0.pdf';
$path_parts = pathinfo($filename);
if(strtolower($path_parts['extension']) == 'pdf') {
    if(preg_match('/.*_['d]$/', $path_parts['filename'])){
        // name pattern Matched
    }
} else {
    // Not a PDF file
}