PHP preg_match返回字符串的字符数而不是预期的结果

时间:2015-09-13 18:01:37

标签: php regex preg-match

我正在尝试搜索在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"
        )
)

或类似的!我做错了什么?

2 个答案:

答案 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)

尝试使用以下模式:

/([a-zA-Z][a-zA-Z0-9_]*)\s*=\s*(|['"])(.+)\2/g

工作示例@ regex101