我是regexp的新手,在尝试匹配 firstname-fristname firstname 形式名称中的名称部分时遇到了一个产生意外结果的正则表达式:
preg_match_all('/([^- ])*/i', 'aNNA-äöå Åsa', $result);
给出print_r($result)
,如下所示:
Array
(
[0] => Array
(
[0] => aNNA
[1] =>
[2] => äöå
[3] =>
[4] => Åsa
[5] =>
)
[1] => Array
(
[0] => A
[1] =>
[2] => å
[3] =>
[4] => a
[5] =>
)
)
现在$result[0]
有我想要的项目和期望的结果,但$results[1]
来自哪里 - 我看到它是结尾这个词,但是为什么它们匹配?< / p>
作为一个小问题,我如何阻止空匹配($results[0][1]
,$results[0][3]
,......),甚至更好:为什么它们出现 - 它们不是 - 或者不是空格?
答案 0 :(得分:1)
*表示“前面的0或更多”。由于“ - ”是字符类的正好0 ,因此匹配。但是,由于它从字符类中省略,因此捕获无法抓取任何内容,从而为您留下一个空条目。给出预期行为的表达式为:
preg_match_all('/([^- ])+/i', 'aNNA-äöå Åsa', $result);
(“+”表示“前面的一个或多个。”)
答案 1 :(得分:1)
http://php.net/manual/en/function.preg-match-all.php说:
对结果进行排序,以便$ matches [0]是一个完整模式的数组 匹配,$ matches [1]是由第一个匹配的字符串数组 带括号的子模式,依此类推。
检查网址以获取更多详情
答案 2 :(得分:1)
尝试使用:
preg_match_all('/([^- ]+)/', 'aNNA-äöå Åsa', $result);
你的正则表达式:
/([^- ])*/i
表示:找到一个不是^
或空格的字符,并将其保存在0或更多次的组中
这一个:
/([^- ]+)/
表示:找到一个或多个不是^
或空格的字符并将其保存在一个组中
此外,不需要不区分大小写。