编译失败:偏移不支持POSIX整理元素

时间:2019-05-12 23:12:41

标签: php regex pattern-matching preg-match-all regex-group

我想将字符串转换为带有模式的数组。但是我的正则表达式给了我警告。

这是一个字符串:

$string = typ="bar" title="Example" enabled=true count=true style="float: left; width: 30%;"

我的正则表达式:

$regex='/(.*?)[=\"|=](.*?)\"*\s*/';
preg_match_all($regex, $string1, $matchesreg, PREG_SET_ORDER);

正则表达式输出不正确。最后一个数组必须进一步拆分     $ regex ='/(。?)=“(。?)” \ s * /';     preg_match_all($ regex,$ string1,$ matchesreg,PREG_SET_ORDER); 输出

Array
     (  
         [0] => Array
             (
                 [0] => typ="bar" 
                 [1] => typ
                 [2] => bar
             ) ...
         [2] => Array
             (
                 [0] => enabled=true count=true style="float: left; width: 30%;"
                 [1] => enabled=true count=true style
                 [2] => float: left; width: 30%;
             )    
     )

我想要的输出,如:

php
Array
(
    [0] => Array
        (
            [0] => typ="bar" 
            [1] => typ
            [2] => bar
        )    
    [1] => Array
        (
            [0] => title="Example" 
            [1] => title
            [2] => Example
        )    
    [2] => Array
        (
            [0] => enabled=true
            [1] => enabled
            [2] => true
        )    
    [3] => Array
        (
            [0] => count=true
            [1] => count
            [2] => true
        )    
    [4] => Array
        (
            [0] => style="float: left; width: 30%;"
            [1] => style
            [2] => float: left; width: 30%;
        )    
)

2 个答案:

答案 0 :(得分:1)

您可以使用

preg_match_all('~([^\s=]+)=(?|"([^"]*)"|(\S+))~', $s, $m, PREG_SET_ORDER, 0)

请参见PHP demo

详细信息

  • ([^\s=]+)-第1组:除空格和=之外的一个或多个字符
  • =-一个=字符
  • (?|"([^"]*)"|(\S+))-符合以下任一条件的分支重置组
    • "([^"]*)"-",然后将"以外的0个或多个字符捕获到组2中,然后匹配"
    • |-或
    • (\S+)-第2组:一个或多个非空白字符。

答案 1 :(得分:0)

您的表情似乎运作良好。您的字符列表中有两个=,我删除了其中一个:

(.*?)[=\"|](.*?)\"*\s* 

如果愿意,您可以在this link中修改/更改表达式。

enter image description here

RegEx电路

您可以在此link中可视化您的表情:

enter image description here

代码

$string1 = 'typ="bar" title="Example" enabled=true count=true style="float: left; width: 30%;';
$regex = '/(.*?)[=\"|](.*?)\"*\s*/s';
preg_match_all($regex, $string1, $matchesreg, PREG_SET_ORDER);

var_dump($matchesreg);

输出

array(7) {
  [0]=>
  array(3) {
    [0]=>
    string(5) "typ=""
    [1]=>
    string(3) "typ"
    [2]=>
    string(0) ""
  }
  [1]=>
  array(3) {
    [0]=>
    string(5) "bar" "
    [1]=>
    string(3) "bar"
    [2]=>
    string(0) ""
  }
  [2]=>
  array(3) {
    [0]=>
    string(7) "title=""
    [1]=>
    string(5) "title"
    [2]=>
    string(0) ""
  }
  [3]=>
  array(3) {
    [0]=>
    string(9) "Example" "
    [1]=>
    string(7) "Example"
    [2]=>
    string(0) ""
  }
  [4]=>
  array(3) {
    [0]=>
    string(8) "enabled="
    [1]=>
    string(7) "enabled"
    [2]=>
    string(0) ""
  }
  [5]=>
  array(3) {
    [0]=>
    string(11) "true count="
    [1]=>
    string(10) "true count"
    [2]=>
    string(0) ""
  }
  [6]=>
  array(3) {
    [0]=>
    string(12) "true style=""
    [1]=>
    string(10) "true style"
    [2]=>
    string(0) ""
  }
}