我一直在写一个 preg_match
我有一个字符串:
XPMG_ar121023.txt
并且需要提取XPMG_
和第一个数字之间的 2 个字母 - 无论是 0-9
$str = 'XPMG_ar121023.txt';
preg_match('/('XPMG_')|[0-9\,]))/', $str, $match);
print_r($match);
也许这不是最好的选择:我的角色将永远是
我一直在写一个 preg_match
我有一个字符串:
XPMG_ar121023.txt
并且需要提取XPMG_
和第一个数字之间的 2 个字母 - 无论是 0-9
$str = 'XPMG_ar121023.txt';
preg_match('/('XPMG_')|[0-9\,]))/', $str, $match);
print_r($match);
也许这不是最好的选择:我的角色将永远是
你可以做
$str = "XPMG_ar121023.txt" ;
preg_match('/_([a-z]+)/i', $str, $match);
var_dump($match[1]);
输出
string 'ar' (length=2)
这对于正则表达式来说太简单了。只会得到你$match = substr($str,5,3)
想要的。
让我一步一步地走一遍,以便帮助您将来解决类似的问题。假设我们的文件名具有以下格式:
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
希望这可以帮助。
好吧,为什么不:
$letters = $str[5].$str[6];
:) 毕竟,您总是需要固定前缀后的 2 个字符,有很多方法不需要substr()
正则表达式(无论如何都是最好的)