<?php
$string = "Movies and Stars I., 32. part";
$pattern = "((IX|IV|V?I{0,3}[\.]))";
if(preg_match($pattern, $string, $x) == false)
{
print "NAPAKA!";
}
else
{
print_r($x);
}
?>
响应是:
Array ( [0] => I. [1] => I. )
我应该只得到1个回复...为什么我会得到多个回复?
答案 0 :(得分:1)
在这种情况下,嵌套括号应该是一个“非捕获”子模式。
$pattern = "~((?:IX|IV|V?I{0,3}[\.]))~";
试试吧。它将告诉正则表达式编译器不将这些括号的结果捕获到数组中。
事实上,看看你的正则表达式,你甚至不需要那些括号。让你的正则表达式:
$pattern = "~IX|IV|V?I{0,3}[\.]~";
那也应该有用。
答案 1 :(得分:1)
您的模式中包含多个组 - &gt; ()括号告诉你在比赛中要捕捉的内容。
试试这个:
$pattern = "(IX|IV|V?I{0,3}[\.])";
如果您很难在结果中识别所需的群组,则可以按照php.net documentation中的指定对其进行命名。
这看起来像这样:
$pattern = "(?P<groupname>IX|IV|V?I{0,3}[\.])";
答案 2 :(得分:1)
索引0处的元素是整个匹配的字符串。索引1处的元素是第一个捕获组的内容,即括号内的内容。在这种情况下,它们碰巧是相同的。只需使用$x[0]
即可获得您正在寻找的价值。
答案 3 :(得分:0)
你得到所有数学字符串的0索引和每个paretness ()
的结果。得到群体是有帮助的,
preg_match('~([0-9]+)([a-z]+)','12abc',$x);
$x is ([0]=>12abc [1]=>12 [2]=>abc)
在您的情况下,您只需删除()
(其中1对,1对用作分隔符)