如何使用PHP检测字符串中的名称,数字和注释(可选)?

时间:2013-03-01 13:09:12

标签: php regex

我在泡菜中,我有以下几行:

John Smith
John Smith +1
John Smith (drink)
John Smith              (    drink      )         
John Smith, drink
John Smith   ,    drink
John Smith   +1   ,    drink
John Smith +1 (drink)
John Smith +1, drink
John Smith +1 drink

我需要做的是将它们放入像

这样的数组中
'array' => 
    'name' => 'John Smith',
    'plus' => '',
    'comment' => ''
,
'array' =>
    'name' => 'John Smith',
    'plus' => '+1',
    'comment' => ''
,
'array' => 
    'name' => 'John Smith',
    'plus' => '',
    'comment' => 'drink'

依此类推......这似乎我需要一些谷歌级别的正则表达式。到目前为止,我使用\nforeach线条爆炸整个.txt文件,然后按space进行爆炸,然后我发现自己处于一团糟之中。因此,如果有人对如何做到这一点有任何更好的想法,我会为了这些知识而杀人。任何帮助表示赞赏。任何我的意思都是任何一种。

2 个答案:

答案 0 :(得分:0)

让我向您展示一个非常脆弱的解决方案,它适用于您的示例字符串:

^ *+([A-Za-z ]*[A-Za-z]) *+(\+\d+)?+ *+(?|,?+ *+\( *+(.*\S) *\) *|,?+ *+(.*\S) *)?$

名称将在捕获组1中。编号(包括符号)将在捕获组2中。评论将在捕获组3中。

目前,假设名称只能包含空格和英文字母。

另一个假设是只有空格(ASCII 32)被识别为间距字符。

Demo(请忽略这些标志,它们仅用于演示目的。)

答案 1 :(得分:0)

适用于您的样本的道路的另一个脆弱的正则表达式

$lines = array
(
"John Smith",
"John Smith +1",
"John Smith (drink)",
"John Smith              (    drink      )",
"John Smith, drink",
"John Smith   ,    drink",
"John Smith   +1   ,    drink",
"John Smith +1 (drink)",
"John Smith +1, drink",
"John Smith +1 drink"
);

foreach($lines as $line)
{
    preg_match('/^(?<name>\w+(?:\s+\w+)?)(?:[\s,]+(?<plus>\+\d+))?(?:[\s,\(]+(?<comment>\w+)[\s\)]*)?$/', $line, $matches);
    var_dump($matches);
}