【问题标题】:Compilation failed: POSIX collating elements are not supported at offset编译失败:偏移量不支持 POSIX 整理元素
【发布时间】:2019-05-12 23:12:41
【问题描述】:

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

这是一个字符串:

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

【问题讨论】:

  • 试试preg_match_all('~([^\s=]+)=(?|"([^"]*)"|(\S+))~', $s, $m, PREG_SET_ORDER, 0),见3v4l.org/hJcmW
  • 谢谢。这可能是正确的正则表达式。今晚我将在我的函数中进一步测试它。
  • 很高兴我的回答对你有用。如果我的回答对我有帮助,也请考虑点赞(见How to upvote on Stack Overflow?)。
  • 今天中午,投票不想要。只是在另一台计算机上它工作。 ;)

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


【解决方案1】:

你可以使用

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

PHP demo

详情

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

【讨论】:

    【解决方案2】:

    您的表情似乎工作正常。您的字符列表中有两个 = 我删除了其中一个:

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

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

    正则表达式电路

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

    代码

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

    【讨论】:

    • 你确定匹配 OP 的期望输出吗?
    猜你喜欢
    • 1970-01-01
    • 2022-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2020-03-20
    • 2019-09-19
    相关资源
    最近更新 更多