1

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

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,但后来我发现自己陷入了混乱之中。因此,如果有人对如何做到这一点有任何更好的想法,我会为这些知识而杀人。任何帮助表示赞赏。我的意思是任何一种。

4

2 回答 2

0

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

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

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

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

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

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

于 2013-03-01T13:58:23.043 回答
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);
}
于 2013-03-01T14:19:55.113 回答