PHP Regex Match获得意外输出

时间:2015-10-13 11:16:27

标签: php regex

我正在尝试创建一个简单的PHP脚本,该脚本从字符串中检索信息并将其放入数组中。我已经在多捕获正则表达式的一些网站上查看了一个模式,但似乎无法获得我正在寻找的输出

目前这是我的剧本。

$input = "username: jack number: 20";
//$input = file_get_contents("test.txt");

preg_match_all("/username: ([^\s]+)|number: ([^\s]+)/", $input, $data);

var_dump($data);

产生此输出:

0 => 
    array (size=2)
      0 => string 'username: jack' (length=14)
      1 => string 'number: 20' (length=10)
  1 => 
    array (size=2)
      0 => string 'jack' (length=4)
      1 => string '' (length=0)
  2 => 
    array (size=2)
      0 => string '' (length=0)
      1 => string '20' (length=2)

我希望将数据转换为以下形式:

0 =>
  array (size=x)
    0 => string 'jack'
1 =>
  array (size=x)
    0 => string '20'

或两个不同的数组,其中键对应于相同的用户/数字组合

2 个答案:

答案 0 :(得分:2)

您可以使用match-reset \K

preg_match_all('/\b(?:username|number):\h*\K\S+/', $input, $data);

print_r($data[0]);
Array
(
    [0] => jack
    [1] => 20
)

RegEx分手:

\b                    => a word boundary
(?:username|number)   => matches username or number. (?:..) is non-capturing group
:\h*                  => matches a colon followed optional horizontal spaces
\K                    => match reset, causes regex engine to forget matched data
\S+                   => match 1 or more non-space chars

否则,您可以使用捕获群组来获取匹配的数据,如下所示:

preg_match_all('/\b(?:username|number):\h*(\S+)/', $input, $data);

print_r($data[1]);
Array
(
    [0] => jack
    [1] => 20
)

答案 1 :(得分:0)

(?<=username:|number:)\s*(\S+)

您可以在此处使用lookbehind。参见演示。

https://regex101.com/r/mG8kZ9/10