$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 代替空格以匹配任何白色字符,例如制表符..
(\d+(\.\d+)?)
... \d+
表示一位或多位数字,(\.\d+)
表示点后跟一位或多位数字,问号表示前面的括号(\.\d+)
是可选的。
Preg_match_all 将这些匹配存储在第三个参数中并返回匹配数。in$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+)
!!! 我格式错误,它消失了。**重写它,现在应该没问题。