Preg Match All为单个变量

时间:2017-07-02 23:52:38

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

我真的陷入了我的代码中。

我的文字看起来像这样

  

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

我需要 [[QVQ]] 背后的文字。我读到了关于preg match。

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

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

喜欢$ match1,$ match2,$ match3 [...]

2 个答案:

答案 0 :(得分:0)

每个[]都需要进行转义,而不会转义您创建的字符类,即允许字符列表或范围(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

答案 1 :(得分:0)

因为克里斯没有使用他的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,NULL,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'
     )
 )