Ошибка компиляции: элементы сортировки POSIX не поддерживаются по смещению - PullRequest
2 голосов
/ 13 мая 2019

Я хотел бы преобразовать строку в массив с шаблоном. Но мое регулярное выражение дает мне предупреждение.

это строка:

$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);

С регулярным выражением вывод не верен. Последний массив должен быть разделен дальше $ Регулярное выражение = '/ (. ) = "(. )" \ s * /'; preg_match_all ($ regex, $ string1, $ matchreg, 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 ]

1 голос
/ 13 мая 2019

Вы можете использовать

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

См. PHP-демо

Подробнее

  • ([^\s=]+)- Группа 1: один или несколько символов, отличных от пробелов, и =
  • = - = char
  • (?|"([^"]*)"|(\S+)) - группа сброса ветви, соответствующая любому из
    • "([^"]*)" - ", затем любые 0 или более символов, кроме ", включаются в группу 2, а затем " сопоставляется
    • | - или
    • (\S+) - Группа 2: один или несколько непробельных символов.
0 голосов
/ 13 мая 2019

Ваше выражение лица работает нормально. В вашем списке символов было два =, и я удалил один из них:

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

Вы можете изменить / изменить свои выражения в по этой ссылке , если хотите.

enter image description here

RegEx Circuit

Вы можете визуализировать свои выражения в этой ссылке :

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) ""
  }
}
...