我在泡菜中,我有以下几行:
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'
依此类推......这似乎我需要一些谷歌级别的正则表达式。到目前为止,我使用\n
和foreach
线条爆炸整个.txt文件,然后按space
进行爆炸,然后我发现自己处于一团糟之中。因此,如果有人对如何做到这一点有任何更好的想法,我会为了这些知识而杀人。任何帮助表示赞赏。任何我的意思都是任何一种。
答案 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);
}