Php 字符和任何数字之间的预匹配

Php 字符和任何数字之间的预匹配,php,preg-match,Php,Preg Match,我一直在写预赛 我有一个字符串: XPMG_ar121023.txt 并且需要提取XPMG\uu和第一个数字之间的2个字母-可以是0-9 $str = 'XPMG_ar121023.txt'; preg_match('/('XPMG_')|[0-9\,]))/', $str, $match); print_r($match); 也许这不是最好的选择:我的字符总是这对于正则表达式来说太简单了。只要$match=substr($str,5,3)就可以满足您的要求。这对于正则表达式来说太简单了。只

我一直在写预赛

我有一个字符串:

XPMG_ar121023.txt
并且需要提取
XPMG\uu
和第一个数字之间的2个字母-可以是0-9

$str = 'XPMG_ar121023.txt';
preg_match('/('XPMG_')|[0-9\,]))/', $str, $match);
print_r($match);

也许这不是最好的选择:我的字符总是

这对于正则表达式来说太简单了。只要
$match=substr($str,5,3)
就可以满足您的要求。

这对于正则表达式来说太简单了。只要
$match=substr($str,5,3)
就可以满足你的要求。

你可以这样做

$str = "XPMG_ar121023.txt" ;
preg_match('/_([a-z]+)/i', $str, $match);
var_dump($match[1]);
输出

string 'ar' (length=2)
你可以这么做

$str = "XPMG_ar121023.txt" ;
preg_match('/_([a-z]+)/i', $str, $match);
var_dump($match[1]);
输出

string 'ar' (length=2)
那么,为什么不:

$letters = $str[5].$str[6];
:) 毕竟,在固定前缀之后总是需要2个字符,有很多方法不需要regexp(
substr()
无论如何都是最好的)

那么,为什么不呢:

$letters = $str[5].$str[6];
:)
毕竟,在固定前缀之后总是需要2个字符,有许多方法不需要regexp(
substr()
无论如何都是最好的)

让我一步一步地介绍一下,以帮助您将来解决类似的问题。假设我们的文件名采用以下格式:

XPMG_ar121023.txt
我们知道我们想要捕捉什么,我们想要的是“ar”就在数字开始之前。所以我们的表达式应该是这样的:

_[a-z]+
这很直截了当。我们首先查找一个下划线,后跟a和z之间的任意数量的字母。方括号用于定义字符类。我们的课程由字母表组成,但你们可以在那个里输入特定的数字,若你们喜欢的话,还可以输入更多

现在,因为我们只想捕获字母,所以需要在模式的该部分周围加上括号:

_([a-z]+)
因此,我们现在只能访问该子模式。接下来,我们放置分隔符以指定模式的开始和结束位置:

/_([a-z]+)/
最后,在结束分隔符之后,我们可以添加一些修饰符。正如所写的,我们的模式只查找小写字母。我们可以添加
i
修饰符,使其不区分大小写:

/_([a-z]+)/i
瞧,我们完了。现在,我们可以将其传递到
preg_match
中,以查看其输出的内容:

preg_match( "/_([a-z]+)/i", "XPMG_ar121023.txt", $match );
此函数将模式作为第一个参数,将与之匹配的字符串作为第二个参数,最后是一个将结果输出到其中的变量。当所有这些都说了又做了之后,我们可以检查
$match
以获取我们的数据

此操作的结果如下所示:

array(2) { 
    [0]=> string(3) "_ar" 
    [1]=> string(2) "ar" 
}
这是
$match
的内容。请注意,我们的完整模式在数组的第一个索引中找到,捕获的部分在数组的第二个索引中提供

echo $match[1]; // ar

希望这能有所帮助。

让我一步一步地介绍一下,以帮助您将来解决类似的问题。假设我们的文件名采用以下格式:

XPMG_ar121023.txt
我们知道我们想要捕捉什么,我们想要的是“ar”就在数字开始之前。所以我们的表达式应该是这样的:

_[a-z]+
这很直截了当。我们首先查找一个下划线,后跟a和z之间的任意数量的字母。方括号用于定义字符类。我们的课程由字母表组成,但你们可以在那个里输入特定的数字,若你们喜欢的话,还可以输入更多

现在,因为我们只想捕获字母,所以需要在模式的该部分周围加上括号:

_([a-z]+)
因此,我们现在只能访问该子模式。接下来,我们放置分隔符以指定模式的开始和结束位置:

/_([a-z]+)/
最后,在结束分隔符之后,我们可以添加一些修饰符。正如所写的,我们的模式只查找小写字母。我们可以添加
i
修饰符,使其不区分大小写:

/_([a-z]+)/i
瞧,我们完了。现在,我们可以将其传递到
preg_match
中,以查看其输出的内容:

preg_match( "/_([a-z]+)/i", "XPMG_ar121023.txt", $match );
此函数将模式作为第一个参数,将与之匹配的字符串作为第二个参数,最后是一个将结果输出到其中的变量。当所有这些都说了又做了之后,我们可以检查
$match
以获取我们的数据

此操作的结果如下所示:

array(2) { 
    [0]=> string(3) "_ar" 
    [1]=> string(2) "ar" 
}
这是
$match
的内容。请注意,我们的完整模式在数组的第一个索引中找到,捕获的部分在数组的第二个索引中提供

echo $match[1]; // ar

希望这有帮助。

如果格式总是一样的,你可以使用
substr($str,5,2)
,我认为-那应该返回一个以第6个字符开头的2长度字符串。@andrewsi应该是一个答案:)如果格式总是一样的,你可以使用
substr($str,5,2)
,我认为-这应该返回一个以第6个字符开头的2长度字符串。@andrewsi应该是一个答案:)很好的方法。可能值得注意的是,这是区分大小写的。太棒了。您也不需要转义下划线;不会混淆的。我可能也会使用
I
修饰符,而不是更详细的字符类。类似于
'/([a-z]+)/i'
。为什么
[a-z]+
而不是
[a-z]{2}
,因为他想
提取
[a-z]+
之间的两个字母,而
[a-z]+
只会捕获重复的字母。它不会捕获后面的任何数字,并且比编写
{2}
;)时短两个字符好办法。可能值得注意的是,这是区分大小写的。太棒了。您也不需要转义下划线;不会混淆的。我可能也会使用
I
修饰符,而不是更详细的字符类。类似于
'/([a-z]+)/i'
。为什么
[a-z]+
而不是
[a-z]{2}
,因为他想
提取
[a-z]+
之间的两个字母,而
[a-z]+
只会捕获重复的字母。它不会捕获后面的任何数字,并且比编写
{2}
;)时短两个字符这是一个比我试图通读的课本更好的解释