【问题标题】:Preg Match All into single variablesPreg 全部匹配成单个变量
【发布时间】:2017-12-06 04:00:39
【问题描述】:

我真的卡在我的代码里了。

我有一个看起来像这样的文本

[[QVQ]]钱 [[QVQ]]新西兰 |水 [第二次测试] [[QVQ]]谁? (性格 测试)[[QVQ]]新车

我需要 [[QVQ]] 后面的文字。我读到了预赛。

preg_match_all('/\[[QVQ\]](.*?)\[[QVQ\]]/s', $input, $matches);

但是在这种情况下如何使用 preg_match 将匹配项放入单个变量中?

像 $match1 , $match2 ,$match3 [...]

【问题讨论】:

    标签: php regex preg-match preg-match-all


    【解决方案1】:

    每个[] 都需要转义,而无需转义您创建的字符类,该字符类是允许的字符列表或范围(0-9,可以是任何单个数字)。你可以在这里阅读更多内容,http://www.regular-expressions.info/charclass.html

    代码:

    preg_match_all('/\[\[QVQ\]\](.*?)\[\[QVQ\]\]/s', '[[QVQ]]Money [[QVQ]]New Zealand | WATER [ 2nd Test ] [[QVQ]]Who? (Personality 
    Test) [[QVQ]] New Car', $matches);
    print_r($matches[1]);
    

    演示:https://eval.in/826134
    正则表达式演示:https://regex101.com/r/nHELMW/1/

    $matches[1] 将是所有找到的术语的数组。

    更新:

    由于您实际上拥有的是 [[QVQ]] 作为标记,因此您应该使用 preg_split

    $matches = preg_split('/\[\[QVQ\]\]/', '[[QVQ]]Money [[QVQ]]New Zealand | WATER [ 2nd Test ] [[QVQ]]Who? (Personality Test) [[QVQ]] New Car', -1, PREG_SPLIT_NO_EMPTY);
    

    $matches 将成为一个包含所有匹配项的数组。

    演示:https://eval.in/826151

    【讨论】:

    • 非常感谢!但是此示例中缺少“新西兰 | WATER [第二次测试]”:(
    • [[QVQ]] 是起始定界符,新的 [[QVQ]] 是另一个起始定界符,所以它也是一个结束定界符,基本上我想要每个起始定界符后面的文本跨度>
    • 我认为两者似乎都有效,但我很难找到一种方法使其与 $matches[1] 像你以前一样工作,所以我可以再次使用该变量
    【解决方案2】:

    由于 chris 没有使用带有 preg_match_all() 模式的环视功能,因此不会捕获所有子字符串。

    这将使用preg_match_all() 捕获所有子字符串(没有任何不需要的前导/尾随空格字符):/(?<=\]{2}) ?\K.+?(?=$| \[{2})/ Pattern Demo

    var_export(preg_match_all('/(?<=\]{2}) ?\K.+?(?=$| \[{2})/', $input, $out) ? $out[0] : []);
    

    chris 的preg_split() 方法不与前导和尾随空格竞争。这是一个更正/改进的方法(这是我推荐的正则表达式方法):

    var_export(preg_split('/ ?\[{2}QVQ\]{2} ?/', $input, 0, PREG_SPLIT_NO_EMPTY));
    

    这是一个非正则表达式方法:

    var_export(array_values(array_filter(array_map('trim', explode('[[QVQ]]', $input)), 'strlen')));
    

    非正则表达式方法的分解:

    array_values(                          // reindex the array
        array_filter(                      // unset any empty elements 
            array_map('trim',              // remove leading/trailing spaces from each element
                explode('[[QVQ]]', $input) // split on known delimiter
            ),
            'strlen'
         )
     )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-22
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多