PHP:preg_match问题

时间:2013-09-30 00:25:57

标签: php preg-match

我遇到了preg_match的问题,不知何故,我仍然是preg_match的新手,我仍然无法让它像我想要的那样工作。

这是我的数据......

String_Length_Location_Time_Degree_Alt

我正在使用这个preg_match将数据拆分为varibles ...

preg_match('(?<data1>)_(?<data2>)_(?<data3>)_(?<data4>)_(?<data5>)_(?<data6>)', $str, $matches);

我收到以下错误“preg_match(): [...] [...] 中的未知修饰符'_'”

有没有人知道会出现什么问题?

谢谢!

3 个答案:

答案 0 :(得分:3)

您没有delimiters。分隔符包含模式:

  

使用PCRE功能时,要求图案由分隔符包围。分隔符可以是任何非字母数字,非反斜杠,非空白字符。

通常,“修饰符”是为正则表达式设置选项的字符(区分大小写,多行模式等),在结束分隔符之后来自

因此,此错误消息表示它认为您使用_作为修饰符,因为它似乎在模式之后。尝试将模式封装在标准分隔符/中,与/PATTERN_GOES_HERE/

中一样

您还需要匹配捕获组中的内容。 .*会做(匹配任何数量的任何内容):

preg_match('/(?<data1>.*)_(?<data2>.*)_(?<data3>.*)_(?<data4>.*)_(?<data5>.*)_(?<data6>.*)/', $str, $matches);

print_r($matches);

输出:

Array
(
    [0] => String_Length_Location_Time_Degree_Alt
    [data1] => String
    [1] => String
    [data2] => Length
    [2] => Length
    [data3] => Location
    [3] => Location
    [data4] => Time
    [4] => Time
    [data5] => Degree
    [5] => Degree
    [data6] => Alt
    [6] => Alt
)

或者,您的案例看起来像是explode的一个很好的候选者,它将字符串分隔成一个数组,每当它遇到一个分隔符时分割该字符串,您将其指定为非定义字符{{1} }。

答案 1 :(得分:0)

由于您的所有数据都以下划线分隔,为什么不使用explode

$data = explode('_', $str);
$data[0] = 'string';
$data[1] = 'Length'; //etc...

答案 2 :(得分:0)

您的代码存在两个问题......

  1. 你遗漏了包含你的正则表达式的分隔符。
  2. 你实际上没有抓到任何东西。
  3. 修复代码

    在每一端添加的分隔符/以及添加.*以在_

    之间捕获任何字符时,不用多说
    preg_match('/(?<data1>.*)_(?<data2>.*)_(?<data3>.*)_(?<data4>.*)_(?<data5>.*)_(?<data6>.*)/', $string, $match);
    

    替代

    您可以轻松使用explode功能,因为您的数据仅由字符分隔。

    如果你想使用正则表达式,你也可以使用preg_match_all,这将使你的代码更容易阅读(假设你读取正则表达式;)

    $string = "String_Length_Location_Time_Degree_Alt";
    
    $explode = explode('_', $string);
    var_dump($explode);
    
    preg_match_all('/_*(.+?)(?:_|$)/',$string, $matches);
    var_dump($matches);
    
    /**
    
    Output for explode:
    
    array(6) {
      [0]=>
      string(6) "String"
      [1]=>
      string(6) "Length"
      [2]=>
      string(8) "Location"
      [3]=>
      string(4) "Time"
      [4]=>
      string(6) "Degree"
      [5]=>
      string(3) "Alt"
    }
    
    Output for preg_match_all:
    
    array(2) {
      [0]=>
      array(6) {
        [0]=>
        string(7) "String_"
        [1]=>
        string(7) "Length_"
        [2]=>
        string(9) "Location_"
        [3]=>
        string(5) "Time_"
        [4]=>
        string(7) "Degree_"
        [5]=>
        string(3) "Alt"
      }
      [1]=>
      array(6) {
        [0]=>
        string(6) "String"
        [1]=>
        string(6) "Length"
        [2]=>
        string(8) "Location"
        [3]=>
        string(4) "Time"
        [4]=>
        string(6) "Degree"
        [5]=>
        string(3) "Alt"
      }
    }
    
    
    */