我正在尝试搜索在shell脚本中定义的变量。
<?php
$code = '
#!/bin/bash
foo = "Hello world!"
bar="123"
echo -e "The value of foo is $foo\n"
echo -e "The value of bar is $bar"
';
$var_pattern = "/(^[a-zA-Z0-9_]+[\= ]+([\"\']?)+(.)+([\"\']?))*$/";
preg_match($var_pattern, $code, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
上面的例子中定义了两个变量(foo&amp; bar)。我使用regex101.com检查了正则表达式。
我得到的结果是......
Array
(
[0] => Array
(
[0] =>
[1] => 121
)
)
121似乎是代码中的字符数。我期待的结果更像是......
Array
(
[0] => Array
(
[0] =>
[1] => foo = "Hello world!"
),
[1] => Array
(
[0] =>
[1] => bar="123"
)
)
或类似的!我做错了什么?
答案 0 :(得分:0)
你原来的方法有几个问题:
/m
多行标记,因此^$
没有锚定行。(…)*
捕获组已完全自定义*
(.)+
只捕获包含值的一个字母。PREG_OFFSET_CAPTURE
是多余的。由于这或多或少是一种经典的ini风格格式,您只需使用:
key value multiline
↑ ↑ ↑
preg_match_all("/^ (\w+) \s*=\s* [\"\']? (.+?) [\"\']? $/mix", $str, $m);
↓ ↓ ↓
equal quote quote
之后,您甚至可以使用=array_combine($m[1], $m[2])
从$m
匹配数组重建关联键→值数组。
答案 1 :(得分:0)