2015-05-20 92 views
-1

我在iPhone上打字因此这将是我很难格式化代码等PHP复杂的正则表达式

基本上,我有内容类似下面的文本文件:

Mercedes Benz 4726498 on April 23rd 2015 03:02:14 am (1847284839) 
Vauxhall Astra 3819482 on April 25th 2015 01:26:34 pm (382838484) 
Vauxhall Astra Estate 4728482 (22) on June 22nd 2015 02:48:42 pm (382848388) 

基本上,它是一个系列的多个词之一,有7位数字,然后在括号中的一些机会,日期字符串,并在年底

每一行都将有一系列的括号中的数字的字数,7位数字,日期字符串和数字结尾

在括号如在第三行中的数字是在某些行而不是全部

基本上,我想要写在PHP正则表达式来提取所有这些信息以外的日期字符串

I”我已经尝试过各种各样的尝试和错误,只是无法达成解决方案!

如果有人能帮助我,我会非常感激! :-)

编辑追加评论最佳尝试: 它是这样的:

preg_match('/(^[a-zA-Z\'-]+\s[a-zA-Z\'-]+) ([0-9]+) (([0-9]+))(\s(([0-9]{2}?)))?/', $line, $matches); 

谢谢你们! 马克

+1

请发布您的最佳尝试,即使它不起作用。解决方案非常简单,应该很容易解释你出错的地方。 – Amadan

+0

尝试一个活的正则表达式编辑器(http://www.phpliveregex.com)来摆弄! – Luke

+0

@Amadan我目前正在关闭计算机,但它是这样的:preg_match('/(^ [a-zA-Z \'-_] + \ s [a-zA-Z \' - _)+)([0-9] +)\(([0-9] +)\)(\ s \(([0-9] {2}?)\))?/',$ line, $匹配); -----我似乎无法让它可选地抓住括号中的数字。我显然不是正则表达式专家!我的代码也只需要两个字,而不是多个。所以如果有三个字开头,它将不匹配:( –

回答

1

以下似乎工作:

([A-Za-z ]*) ([0-9]{7}) (?:\(([0-9]{2})\))?on ([A-Za-z0-9: ]*) \(([0-9]*)\)

当应用到例如输入,我们得到如下数组:

array(6 
    0 => Mercedes Benz 4726498 on April 23rd 2015 03:02:14 am (1847284839) 
    1 => Mercedes Benz 
    2 => 4726498 
    3 => 
    4 => April 23rd 2015 03:02:14 am 
    5 => 1847284839 
) 

array(6 
    0 => Vauxhall Astra Estate 4728482 (22) on June 22nd 2015 02:48:42 pm (382848388) 
    1 => Vauxhall Astra Estate 
    2 => 4728482 
    3 => 22 
    4 => June 22nd 2015 02:48:42 pm 
    5 => 382848388 
) 

尝试一下在http://www.phpliveregex.com

+0

这看起来非常糟糕,明天当我回到我的电脑并将其标记为正确答案时,我会试一试!干杯 –

+0

好好的,还是在原帖中发布你的解决方案! – Luke

2

你太过于复杂。首先,一般来说,没有必要具体说明哪些角色可以作为单词进入。其次,如果你不知道会有多少单词,不要试图将它们作为单独的单词来匹配。

(\D+)\s+(\d+)\s+(?:\((\d+)\))?.*\((\d+)\) 

应该足够:

  • 一些非数字(捕获为组1)
  • 一些空间
  • 一些数字(捕获作为第2组)
  • 一些空间
  • 可能的括号,里面的一些数字(将它们捕获为组3)
  • 东西
  • 括号,里面的一些数字(捕捉它们作为第4组)

如果可能的话有可能是在车名的数字,那么你可能需要在确定接下来的事情更准确一点(数量):

(.+)\s+(\d{7})\s+(?:\((\d+)\))?.*\((\d+)\)