用于使用preg_match分割参数的正则表达式

时间:2011-04-17 12:38:19

标签: php regex

我目前正在使用此正则表达式:

/([-0-9]+).([-0-9]+).([-0-9]+).([-0-9]+).(.*?).([-0-9]).([-0-9]+).([-0-9.]+).([-0-9.]+).([-0-9.]+).*/i

匹配这种事情:

1 0 61 12345678 sierra007^7 0 0 123.123.123.123:524 26429 25000

我遇到的问题是名称sierra007^7实际上是sierr,然后其后的所有内容都被破坏了。我需要的是.*?部分匹配任何东西然后继续拆分它。如果将.*?更改为.*,则会将其余信息添加到相同的参数中。

有人可以提供一些建议吗?

感谢。

3 个答案:

答案 0 :(得分:4)

也许我真的没有看到你需要什么,但为什么不用explode()来分割你的字符串呢?

例如,这部分代码:

$str = '1 0 61 12345678 sierra007^7 0 0 90.199.42.51:524 26429 25000';
$array = explode(' ', $str);
var_dump($array);

会得到你:

array
  0 => string '1' (length=1)
  1 => string '0' (length=1)
  2 => string '61' (length=2)
  3 => string '12345678' (length=8)
  4 => string 'sierra007^7' (length=11)
  5 => string '0' (length=1)
  6 => string '0' (length=1)
  7 => string '90.199.42.51:524' (length=16)
  8 => string '26429' (length=5)
  9 => string '25000' (length=5)

答案 1 :(得分:2)

而不是(.*?)使用[^ ]+,这应该更快,并且可以像你所说的一样工作。

答案 2 :(得分:0)

我知道原始海报有一个公认的解决方案(效果很好),但请允许我回答正则表达式无效的具体问题。问题是使用点. - 这是一个非常常见的错误。点是一个很少需要或适当的通配符。在这种情况下,点用于分离一组数字组。但数据表明这些字段是用空格分隔的。解决方案很简单;而不是点,用空格分隔字段。此点也以 lazy-dot-star 表达式的形式使用,在这种情况下也不合适。以下是我将如何编写此正则表达式(在带有注释的详细模式中):

$re = '/
    ^               # Anchor to start of line.
    ([-0-9]+)  \s+  # $1: Field 1
    ([-0-9]+)  \s+  # $2: Field 2
    ([-0-9]+)  \s+  # $3: Field 3
    ([-0-9]+)  \s+  # $4: Field 4
    (\S+)      \s+  # $5: Field 5
    ([-0-9])   \s+  # $6: Field 6
    ([-0-9]+)  \s+  # $7: Field 7
    ([-0-9.:]+)\s+  # $8: Field 8
    ([-0-9.]+) \s+  # $9: Field 9
    ([-0-9.]+)      # $10: Field 10
    /mx';

这个正则表达式更加精确,因此会更快地匹配(并且不匹配)。

原始正则表达式的另一个问题是示例字符串的字段#8中的数据包含冒号,该冒号未在第八个正则表达式中指定(即"sierr"不是唯一的字段是错误项匹配的。)

请注意,正则表达式解决方案的优势在于它可以从具有混合,可变格式的更大文本中挑选出匹配记录,其中爆炸解决方案要求每个字符串都具有已知的固定有效格式(可能是这里的情况,所以爆炸解决方案是首选)。