缩短PHP正则表达式

时间:2014-08-01 09:35:57

标签: php regex

在编写应用程序时,我总是遇到必须使用正则表达式的问题。我认为正则表达式非常难,所以我在创建时使用text2re。我认为他们创建了如此长的代码,如果手动完成必须有更好的方法。

我需要匹配15位数的IMEI号码,text2re说这是他们的方式:

//TRIM IMEI
  function fixIMEI($txt)
{
    $re1='.*?'; # Non-greedy match on filler
  $re2='\\d';   # Uninteresting: d
  $re3='.*?';   # Non-greedy match on filler
  $re4='\\d';   # Uninteresting: d
  $re5='.*?';   # Non-greedy match on filler
  $re6='\\d';   # Uninteresting: d
  $re7='.*?';   # Non-greedy match on filler
  $re8='\\d';   # Uninteresting: d
  $re9='.*?';   # Non-greedy match on filler
  $re10='\\d';  # Uninteresting: d
  $re11='.*?';  # Non-greedy match on filler
  $re12='\\d';  # Uninteresting: d
  $re13='.*?';  # Non-greedy match on filler
  $re14='\\d';  # Uninteresting: d
  $re15='.*?';  # Non-greedy match on filler
  $re16='\\d';  # Uninteresting: d
  $re17='.*?';  # Non-greedy match on filler
  $re18='(\\d)';    # Any Single Digit 1
  $re19='(\\d)';    # Any Single Digit 2
  $re20='(\\d)';    # Any Single Digit 3
  $re21='(\\d)';    # Any Single Digit 4
  $re22='(\\d)';    # Any Single Digit 5
  $re23='(\\d)';    # Any Single Digit 6
  $re24='(\\d)';    # Any Single Digit 7
  $re25='(\\d)';    # Any Single Digit 8
  $re26='(\\d)';    # Any Single Digit 9
  $re27='(\\d)';    # Any Single Digit 10
  $re28='(\\d)';    # Any Single Digit 11
  $re29='(\\d)';    # Any Single Digit 12
  $re30='(\\d)';    # Any Single Digit 13
  $re31='(\\d)';    # Any Single Digit 14
  $re32='(\\d)';    # Any Single Digit 15

  if ($c=preg_match_all ("/".$re1.$re2.$re3.$re4.$re5.$re6.$re7.$re8.$re9.$re10.$re11.$re12.$re13.$re14.
                         $re15.$re16.$re17.$re18.$re19.$re20.$re21.$re22.$re23.$re24.$re25.$re26.$re27.
                         $re28.$re29.$re30.$re31.$re32."/is", $txt, $matches))
  {
      $d1=$matches[1][0];
      $d2=$matches[2][0];
      $d3=$matches[3][0];
      $d4=$matches[4][0];
      $d5=$matches[5][0];
      $d6=$matches[6][0];
      $d7=$matches[7][0];
      $d8=$matches[8][0];
      $d9=$matches[9][0];
      $d10=$matches[10][0];
      $d11=$matches[11][0];
      $d12=$matches[12][0];
      $d13=$matches[13][0];
      $d14=$matches[14][0];
      $d15=$matches[15][0];
      return "$d1$d2$d3$d4$d5$d6$d7$d8$d9$d10$d11$d12$d13$d14$d15";
  }

}

3 个答案:

答案 0 :(得分:1)

我认为这个正则表达式应该符合Wikipedia IMEI

/\b\d{2}-?\d{6}-?\d{6}-?(?:\d{1,2})?\b/isg

假设可以省略-个字符。

<强> DEMO

当然这个只能得到数字,但是如果你想确保这是有效的IMEI,你应该使用前面提到的维基百科页面上的算法计算校验和。

答案 1 :(得分:0)

此功能与您发布的功能相同:

function fixIMEI($txt) {
  if (preg_match ("/(.*?\\d){8}.*?(\\d{15})/is", $txt, $match))
     return $match[2];
}

答案 2 :(得分:-1)

如果您只是想从字符串中获取15位数字,我会推荐这个正则表达式:

[\d]{15}