Regex的替代方法,用于从字符串中提取信息

时间:2014-09-23 20:22:56

标签: php regex

我试图从字符串中提取信息,该字符串将始终采用相同的格式。

格式始终为:

To:
                     Name here
Date:
                     26/08/2014 14:52
Order Number:
                     123456
Service Required:
                     Plumbing
Service Response:
                     48 Hour
Service Limit:
                     110.00

123 TEST ROAD
LEEDS
LS1 1HL

Contact:
                     Mr J Smith - 0777 123456
Telephone:
                     01921 123456

Work Details:

Notes here etc 

我试过用空格爆炸字符串并循环遍历数组但是我不能以接收信息的方式构造它。

例如:我尝试在 “To:”之后从检索“此处的名字”,而不检索“日期:等等”。 ,最终的想法是为每一位信息创建变量,以便我可以将其输入数据库。

非常欢迎任何帮助/建议/想法。

感谢阅读

4 个答案:

答案 0 :(得分:2)

如果您不想使用正则表达式,因为您正在寻找第一个字段内容,您可以使用双重爆炸:

$firstfield= trim(explode("\n",explode(':', $data, 3)[1])[1]);

var_dump($firstfield);

否则,要使用正则表达式获取字段和值,可以使用:

$pattern = '~^(\w+(?: \w+)*):\s*(.+?)\s*(?=(?1):|\z)~ms';

preg_match_all($pattern, $data, $m, PREG_SET_ORDER);

foreach ($m as $v) {
    $results[$v[1]] = $v[2];
}

echo $results['To'];

答案 1 :(得分:1)

您可以轻松使用正则表达式。

如果您使用此正则表达式,则可以获取name here

To:\s+(.*)

<强> Working demo

enter image description here

这个正则表达式的想法是寻找你想要寻找的key并获取值。例如,上面的正则表达式查找To:个空格,并将内容存储在捕获组中。

您只需要根据需要更改To,如果将其修改为Date,您将获得日期。

enter image description here

注意,这仅适用于单行值。

在php中实现此正则表达式的代码非常简单,如下所示:

$re = "/To:\\s+(.*)/";
$str = "YOUR STRING HERE";
preg_match($re, $str, $matches);

另一方面,以下数据遵循不同的模式:

123 TEST ROAD
LEEDS
LS1 1HL

您也需要一个不同的正则表达式模式,以便获取您可以使用的信息:

^(\w+[\w\s]+)(?!:)$

<强> Working demo

答案 2 :(得分:0)

稍后更新(已完成的工作)

这是完整的脚本。我想你会感激它的灵活性!

$s = "To:
          Name here
Date:
          26/08/2014 14:52
Order Number:
          123456
Service Required:
          Plumbing
Service Response:
          48 Hour
Service Limit:
          110.00

123 TEST ROAD
LEEDS
LS1 1HL

Contact:
          Mr J Smith - 0777 123456
Telephone:
          01921 123456

Work Details:

Notes here etc ";


$a = Array(
  Array("To:", "Date:" ),
  Array("Date:", "Order Number:" ),
  Array("Order Number:", "Service Required:" ),
  Array("Service Limit:", 'Contact:' ),
  //etc
);  

foreach ($a as $anchors)  {
  $t = explode ($anchors[0], " ".$s );
  $t = explode ($anchors[1], $t[1]  );
  $r = trim($t[0]);
  echo $anchors[0] ." [". $r ."]\n"  ;
}

将产生:

augusto@cubo:~/Documents$ php script.php
To: [Name here]
Date: [26/08/2014 14:52]
Order Number: [123456]
Service Limit: [110.00

123 TEST ROAD
LEEDS
LS1 1HL]

旧答案(概念) 似乎并不太难。

你有许多好的锚点可供使用! explode()将是一个好朋友。

$tmp = explode ('anchor-before', $string  );
$tmp = explode ('anchor-after', $tmp[1]) ;
$res = trim($tmp[0]);

答案 3 :(得分:0)

正则表达并不困难。试试这个吧。

 # '~(?msi)^To:\s*(.*?)\s*^Date:\s*(.*?)\s*^Order\ Number:\s*(.*?)\s*^Service\ Required:\s*(.*?)\s*^Service\ Response:\s*(.*?)\s*^Service\ Limit:\s*(.*?)\s*^Contact:\s*(.*?)\s*^Telephone:\s*(.*?)\s*^Work\ Details:\s*(.*?)\s*~'

 (?msi)
 ^ To: \s* 
 ( .*? )                            # (1)
 \s* 
 ^ Date: \s* 
 ( .*? )                            # (2)
 \s* 
 ^ Order\ Number: \s* 
 ( .*? )                            # (3)
 \s* 
 ^ Service\ Required: \s* 
 ( .*? )                            # (4)
 \s* 
 ^ Service\ Response: \s* 
 ( .*? )                            # (5)
 \s* 
 ^ Service\ Limit: \s* 
 ( .*? )                            # (6)
 \s* 
 ^ Contact: \s* 
 ( .*? )                            # (7)
 \s* 
 ^ Telephone: \s* 
 ( .*? )                            # (8)
 \s* 
 ^ Work\ Details: \s* 
 ( .*? )                            # (9)
 \s* 

输出

 **  Grp 1 -  ( pos 26 , len 9 ) 
Name here  
 **  Grp 2 -  ( pos 65 , len 16 ) 
26/08/2014 14:52  
 **  Grp 3 -  ( pos 119 , len 6 ) 
123456  
 **  Grp 4 -  ( pos 167 , len 8 ) 
Plumbing  
 **  Grp 5 -  ( pos 217 , len 7 ) 
48 Hour  
 **  Grp 6 -  ( pos 263 , len 39 ) 
110.00

123 TEST ROAD
LEEDS
LS1 1HL  
 **  Grp 7 -  ( pos 337 , len 24 ) 
Mr J Smith - 0777 123456  
 **  Grp 8 -  ( pos 396 , len 12 ) 
01921 123456  
 **  Grp 9 -  ( pos 427 , len 0 )  EMPTY