使用正则表达式提取表格数据

时间:2013-01-06 05:37:41

标签: php regex

我有一个包含多个表格的文本文件,如下图所示:

_____________________________________
Heading 1       | Heading 2
_______________ | ___________________
Label1 18857.10 | Label3 710.00
Label2 2361.50  | Label4 0.00
                | Label5 2531.37
                | Label6 0.00
                | Label7 0.00
                | Label8 0.01
________________| ___________________
       16495.60 | Label9 3969.06
_______________ | ___________________

我想使用正则表达式将数值存储到变量中。由于我是正则表达式的新手,我无法找到一种方法。任何人都可以帮我这个吗?

1 个答案:

答案 0 :(得分:1)

$table="_____________________________________
Heading 1       | Heading 2
_______________ | ___________________
Label1 18857.10 | Label3 710.00
Label2 2361.50  | Label4 0.00
                | Label5 2531.37
                | Label6 0.00
                | Label7 0.00
                | Label8 0.01
________________| ___________________
       16495.60 | Label9 3969.06
_______________ | ___________________
";

$num = preg_match_all('/(\w+) (\d+(\.\d+)?)/', $table, $result);


for($i=0; $i<$num; $i++){
  echo "{$result[1][$i]} = {$result[2][$i]}<br>";
}

如果您的表格与您所展示的完全相同,则可行。

正则表达式:/(\w+) (\d+(\.\d+)?)/

开头和结尾处的斜杠/正在分隔正则表达式。

(\w+)表示“匹配任何字母,数字或下划线一次或多次

后面跟着一个空格,你可以在空格后添加+,匹配多个,或者放入\ s而不是空格,以匹配任何白色字符,例如tab。

(\d+(\.\d+)?) ... \d+表示一个或多个数字,(\.\d+)表示点后跟一个或多个数字,问号表示前一个括号(\.\d+)是可选的

Preg_match_all将这些匹配存储在第三个参数中并返回匹配数。在$result[$i][0]中是完整匹配,$result[$i][1]是第一个子表达式(\w+)$result[$i][2]是第二个括号(\d+(\.\d+)?)$result[$i][3]是小数部分(\.\d+),它位于$result[$i][2]内,但您不需要$result[$i][3],只是为了解释:)

代码打印:

Heading = 1
Heading = 2
Label1 = 18857.10
Label3 = 710.00
Label2 = 2361.50
Label4 = 0.00
Label5 = 2531.37
Label6 = 0.00
Label7 = 0.00
Label8 = 0.01
Label9 = 3969.06

编辑:抱歉,它不起作用,它与裸16495.60值不匹配。让我再想一想......

...

$regex='/([a-zA-Z0-9]+)? +(\d+(\.\d+)?)/';

有点好,这是它的工作原理:

  • [a-zA-Z0-9]+匹配非零的字母或数字
  • 括号后的
  • ?表示整个括号表达式是可选的。
  • +一个或多个空格
  • (\d+(\.\d+)?)非零数字的数字后跟可选的{点和另一个非零数字的数字}

整个正则表达式不包括|或新行,因此所有匹配都应该只在表的一个字段中进行。

结果变量应为:

array (size=4)
  0 => 
    array (size=12)
      0 => string 'Heading 1' (length=9)
      1 => string 'Heading 2' (length=9)
      2 => string 'Label1 18857.10' (length=15)
      3 => string 'Label3 710.00' (length=13)
      4 => string 'Label2 2361.50' (length=14)
      5 => string 'Label4 0.00' (length=11)
      6 => string 'Label5 2531.37' (length=14)
      7 => string 'Label6 0.00' (length=11)
      8 => string 'Label7 0.00' (length=11)
      9 => string 'Label8 0.01' (length=11)
      10 => string '           16495.60' (length=19)
      11 => string 'Label9 3969.06' (length=14)
  1 => 
    array (size=12)
      0 => string 'Heading' (length=7)
      1 => string 'Heading' (length=7)
      2 => string 'Label1' (length=6)
      3 => string 'Label3' (length=6)
      4 => string 'Label2' (length=6)
      5 => string 'Label4' (length=6)
      6 => string 'Label5' (length=6)
      7 => string 'Label6' (length=6)
      8 => string 'Label7' (length=6)
      9 => string 'Label8' (length=6)
      10 => string '' (length=0)
      11 => string 'Label9' (length=6)
  2 => 
    array (size=12)
      0 => string '1' (length=1)
      1 => string '2' (length=1)
      2 => string '18857.10' (length=8)
      3 => string '710.00' (length=6)
      4 => string '2361.50' (length=7)
      5 => string '0.00' (length=4)
      6 => string '2531.37' (length=7)
      7 => string '0.00' (length=4)
      8 => string '0.00' (length=4)
      9 => string '0.01' (length=4)
      10 => string '16495.60' (length=8)
      11 => string '3969.06' (length=7)
  3 => 
    array (size=12)
      0 => string '' (length=0)
      1 => string '' (length=0)
      2 => string '.10' (length=3)
      3 => string '.00' (length=3)
      4 => string '.50' (length=3)
      5 => string '.00' (length=3)
      6 => string '.37' (length=3)
      7 => string '.00' (length=3)
      8 => string '.00' (length=3)
      9 => string '.01' (length=3)
      10 => string '.60' (length=3)
      11 => string '.06' (length=3)

编辑2:再次抓住这些小册子!点之前应该有一个反斜杠,在 (\.\d+) !!!我把它弄错了就消失了。**重写了一遍,现在应该没事了。