我真的陷入了我的代码中。
我的文字看起来像这样
[[QVQ]]金钱[[QVQ]]新西兰|水[第二次测试] [[QVQ]]谁? (个性 测试)[[QVQ]]新车
我需要 [[QVQ]] 背后的文字。我读到了关于preg match。
preg_match_all('/\[[QVQ\]](.*?)\[[QVQ\]]/s', $input, $matches);
但是如何在这种情况下使用preg_match将匹配变为单个变量?
喜欢$ match1,$ match2,$ match3 [...]
答案 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
将成为包含所有匹配项的数组。
答案 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'
)
)