preg_match无法正常工作

时间:2017-02-21 04:48:37

标签: php regex preg-match

我有一些数据,我想找出它的价值,所以我尝试preg_match函数,它可以很容易找到值我尝试下面的代码来获取值,但我认为我的代码中有一些问题,因为我是获得$ a的价值,但我尝试在这里找到价值$ a1的所有东西都是m示例代码

$data=Date:29-05-2016 11:36 - Mo:919530489323 - pdd:9339 - lpm:78JIOP-
pas:sami  
preg_match('#Date:(.*?) (.*?) - Mo:91(.*?) - pdd:(.*?) -
lpm:(.*?) - pas:(.*?)#',$data,$matches);  
$a=$matches[3];
 $a1=$matches[6];

现在我做了什么来获得$ a1的价值或什么是正确的代码

2 个答案:

答案 0 :(得分:1)

替换regex的最后一个单词以匹配整个单词。目前它返回空白(如果你有print_r匹配数组)。

使用regex如下:

preg_match('#Date:(.*?) (.*?) - Mo:91(.*?) - pdd:(.*?) - lpm:(.*?) - pas:(.*)#',$data,$matches);  

答案 1 :(得分:1)

由于您的上一个括号使用带有通配符的laziness mark,因此除了其他规则要求之外,它将不会匹配任何内容。没有其他规则来指定整体匹配的结束,因此正则表达式只会跳过最后一部分sami。你可以检查一下:

<?php

$data="Date:29-05-2016 11:36 - Mo:919530489323 - pdd:9339 - lpm:78JIOP - pas:sami";
preg_match('#Date:(.*?) (.*?) - Mo:91(.*?) - pdd:(.*?) - lpm:(.*?) - pas:(.*?)#',$data,$matches);

var_dump($matches);

哪个输出:

array(7) {
  [0]=>
  string(70) "Date:29-05-2016 11:36 - Mo:919530489323 - pdd:9339 - lpm:78JIOP - pas:"
  [1]=>
  string(10) "29-05-2016"
  [2]=>
  string(5) "11:36"
  [3]=>
  string(10) "9530489323"
  [4]=>
  string(4) "9339"
  [5]=>
  string(6) "78JIOP"
  [6]=>
  string(0) ""
}

请注意,整体匹配字符串($matches[0])值实际上在最后:处停止。这就是$matches[6]中有一个空字符串的原因。

使用正则表达式来解决问题:

<?php

$data="Date:29-05-2016 11:36 - Mo:919530489323 - pdd:9339 - lpm:78JIOP - pas:sami";
preg_match('#^Date:(.*?) (.*?) - Mo:91(.*?) - pdd:(.*?) - lpm:(.*?) - pas:(.*?)$#',$data,$matches);         

var_dump($matches);

请注意我已添加的^$。它们将匹配“字符串的开头”和“字符串的结尾”。因此,将包括从最后:到整个输入字符串末尾的字符串。输出这个:

array(7) {
  [0]=>
  string(74) "Date:29-05-2016 11:36 - Mo:919530489323 - pdd:9339 - lpm:78JIOP - pas:sami"
  [1]=>
  string(10) "29-05-2016"
  [2]=>
  string(5) "11:36"
  [3]=>
  string(10) "9530489323"
  [4]=>
  string(4) "9339"
  [5]=>
  string(6) "78JIOP"
  [6]=>
  string(4) "sami"
}