如何在PHP中使用正则表达式来分解这个文件

时间:2011-03-09 05:17:36

标签: php regex

我有一个大的库存文件有多行条目,所有格式都相同:

<item>   xxxxx item details   </item>

我正在考虑通过preg_split使用正则表达式来解决这个问题。所以我可以获得一系列行,每行都是一个单独的项目。

正则表达式的新手。我希望得到一些关于编写正确的正则表达式来定义xxxx

模式的帮助

类似于:^(<item>)\w*(</item>)

但我的测试总是会产生错误。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我认为以下模式应该这样做:

<item>\s*([^<])</item>

如果有多个项目,您需要使用preg_match_all来获取所有项目:

preg_match_all('%<item>\s*([^<]+)</item>%', $db, $items);

之后的$ items将包含一个类似

的数组
array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(28) "<item> 123456 qwerty </item>"
    [1]=>
    string(27) "<item>123 whatsoever</item>"
  }
  [1]=>
  array(2) {
    [0]=>
    string(14) "123456 qwerty "
    [1]=>
    string(14) "123 whatsoever"
  }
}

所以$ item [1]将包含模式中括号内的数组。

我们在这里做什么:首先我们不要将记录限制在^行的开头。然后我们在使用\ s *标记之后跳过空格。然后我们用(...)定义一组我们想要作为输出的字符。在其内部,我们使用[...]定义我们理解为项目信息的字符:该组中的任何字符都适合该模式。这个组中的^使其为负数,因此[^&lt;]将适合任何不是&lt;的字符,这将有效地将我们带到结束标记。 如果您还想将项目信息分成几个部分(如项目ID,描述),您可以将此模式更改为:

<item>\s*(\d+)\s*([^<]+)</item>

然后结果将是:

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(28) "<item> 123456 qwerty </item>"
    [1]=>
    string(27) "<item>123 whatsoever</item>"
  }
  [1]=>
  array(2) {
    [0]=>
    string(6) "123456"
    [1]=>
    string(3) "123"
  }
  [2]=>
  array(2) {
    [0]=>
    string(7) "qwerty "
    [1]=>
    string(10) "whatsoever"
  }
}

$ items [1]包含第一个括号内的内容,$ items [2] - 在第二个组内,依此类推,如果你添加更多。

答案 1 :(得分:0)

不确定为什么你有额外的parens。要检测一串0+非空格字符,并将它们放在字符串开头的组中:

^(\w*)

如果您希望xxx字符串中至少有一个字符,请使用+代替:

^(\w+)

如果您想获得第一组不是空格的字符:

^([^ ]+)

如果你想要第一组不是空格的字符:

^(\S+)

快速说明:将+用于1个或更多内容,使用*表示0或更多内容。