创建正则表达式模式以匹配空格分隔的字符串

时间:2014-01-18 11:46:42

标签: php regex

我的文件有很多行(超过32k)。行看起来像:

34 Item
5423 11Item
44    Item

第一个数字是ID。我想要make assoc。数组:数组(“34”=>“项目”,“5423”=>“11项目”,“44”=>“项目”)

  1. ID可以是1到5长度(1 - 65366)
  2. 项目名称可以从数字
  3. 开始
  4. ID和项目名称之间的最小值(BUT可以多于一个)空格
  5. 因此,主要鸿沟是空间或一定数量。使用PHP。

4 个答案:

答案 0 :(得分:1)

这是一种不检查数据有效性但可能有效的方法。它根据空间爆炸每一行,并将结果放入$res关联数组中 有关信息,preg_split()允许使用正则表达式拆分字符串。

$res = array();
foreach($lines as $line) {
     $data = preg_split('/\s+/', $line);
     $res[$data[0]] = $data[1];     
}

如果您确实想检查条件,可以添加一些if语句,ID限制为:

$res = array();
foreach($lines as $line) {
     $data = preg_split('/\s+/', $line);
     $idx = intval($data[0]);
     if($idx > 0 && $idx < 65366) // skip lines where the ID seems invalid
         $res[$data[0]] = $data[1];     
}

答案 1 :(得分:1)

preg_match与命名捕获组一起使用:

preg_match('/^(?<id>\d+)\s+(?<name>[\w ]+)$/', $row, $matches);

$matches['id']将包含ID,$matches['name']将包含该名称。

while (/* get each row */) {
    preg_match('/^(?<id>\d+)\s+(?<name>[\w ]+)$/', $row, $matches);

    $id = $matches['id'];
    $name = $matches['name'];

    if ($id > 1 && $id < 65366) {
        $arr[$id] = $name;
    }
}

print_r($arr);

示例输出:

Array
(
    [34] => Item
    [5423] => 11Item
    [44] => Item
    [3470] => BLABLA TEF2200
)

Demo

答案 2 :(得分:1)

您可以使用:

$data = <<<'LOD'
34 Item
5423 11Item
44    Item
546
65535 toto le héros
65536 belzebuth
glups  glips
LOD;

$result = array();

$line = strtok($data, "\r\n");

while($line!==false) {
    $tmp = preg_split('~\s+~', $line, 2, PREG_SPLIT_NO_EMPTY);
    if (count($tmp)==2 && $tmp[0]==(string)(int)$tmp[0] && $tmp[0]<65536)
        $result[$tmp[0]] = $tmp[1];
    $line = strtok("\r\n");
}
print_r($result);

答案 3 :(得分:0)

使用http://uk3.php.net/preg_split

 preg_split("/ +/", $line);

它将返回一个字符串数组。