2011-03-09 49 views
2

我有一个大清单文件有条目的多线都具有相同的格式:如何打破这个文件用正则表达式在PHP

<item> xxxxx item details </item> 

我想用正则表达式表达打破这种下降使preg_split的。所以我可以得到一个行数组,每个都是一个单独的项目条目。

新的正则表达式。想获得编写正确的正则表达式来定义XXXX的模式

像一些帮助:^(<item>)\w*(</item>)

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

感谢您的帮助。

回答

0

不知道为什么你有额外的parens。为了检测0+非空格字符的字符串,并在一个字符串的开头让他们在一组:

^(\w*) 

如果你想在你的XXX串,使用至少一个字符,而不是+:

^(\w+) 

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

^([^ ]+) 

如果你想字符的第一组是没有空白:

^(\S+) 

作为一个快速提示:使用+为1或更多的东西,使用*为0或更多的东西。

+0

猜猜我错过了你在xml标签中的事实。在这种情况下,你也需要识别这些,所以其他答案应该适合你。正则表达式开头的胡萝卜匹配字符串的开头,所以它只会在你的图案在字符串的开头 – afranz409 2011-03-09 05:25:12

2

我觉得下面的模式应该这样做:

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

你需要使用preg_match_all让所有的物品,如果有不止一个:

preg_match_all('%<item>\s*([^<]+)</item>%', $db, $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" 
    } 
} 

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

我们在这里做的:第一,我们不限制记录是在与行的开头^。然后我们用\ s *标记后跳过空格。然后我们用(...)定义一组我们想要的字符作为输出。在它里面,我们用[......]来定义我们理解为物品信息的字符:该组中的任何字符都适合该模式。 ^在这组使得它不利,所以[^ <]将适合这不是一个<,这将有效地让我们结束标记任何字符。 如果你也想拆分项目信息分成几个部分(如项目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] - 第二个组内的内容,如果添加更多,则以此类推。