使用非常简单的正则表达式的意外结果

时间:2012-01-25 09:02:08

标签: php regex

我是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],......),甚至更好:为什么它们出现 - 它们不是 - 或者不是空格?

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或更多次的组中

这一个:

/([^- ]+)/

表示:找到一个或多个不是^或空格的字符并将其保存在一个组中

此外,不需要不区分大小写。