1

我一直在写一个 preg_match

我有一个字符串:

XPMG_ar121023.txt

并且需要提取XPMG_和第一个数字之间的 2 个字母 - 无论是 0-9

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

也许这不是最好的选择:我的角色将永远是

4

4 回答 4

2

你可以做

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

输出

string 'ar' (length=2)
于 2012-10-24T18:30:53.333 回答
1

这对于正则表达式来说太简单了。只会得到你$match = substr($str,5,3)想要的。

于 2012-10-24T18:30:34.293 回答
1

让我一步一步地走一遍,以便帮助您将来解决类似的问题。假设我们的文件名具有以下格式:

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

希望这可以帮助。

于 2012-10-24T18:50:27.620 回答
0

好吧,为什么不:

$letters = $str[5].$str[6];

:) 毕竟,您总是需要固定前缀后的 2 个字符,有很多方法不需要substr()正则表达式(无论如何都是最好的)

于 2012-10-24T18:31:03.343 回答