我有一个包含多个表格的文本文件,如下图所示:
_____________________________________
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
_______________ | ___________________
我想使用正则表达式将数值存储到变量中。由于我是正则表达式的新手,我无法找到一种方法。任何人都可以帮我这个吗?
答案 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+)
!!!我把它弄错了就消失了。**重写了一遍,现在应该没事了。