以下是我要过滤的内容:
YO_{
YO_{
YO_{
McDonalds.
}
}
}
现在,我想过滤掉 YO _ {和}之间的文字。我这样做了:
$another_var = preg_replace_callback(
'/YO\_\{(.*?)\}/s',
function($matches) {
return $matches[1];
},
$variable_where_the_content_is_stored
);
但它正在回归:
YO_{
YO_{
McDonalds.
}
}
而不是返回麦当劳
如何让过滤进程(正则表达式)经历多个阶段?
代码只是一个例子,它只使用了我尝试构建的概念。实际的代码更复杂,可能会产生混淆。我只需要经历多个过滤阶段的想法。
谢谢! :)
答案 0 :(得分:0)
以下是工作代码:检查修复内部的注释。
print preg_replace_callback(
'/.*YO\_\{\s*([^}]*?)\s*\}.*/s', // mistake 1 check \s*([^}]*?)\s* and .*
function($matches) {
return $matches[1]; // mistake 2
},
$variable_where_the_content_is_stored
);
但是,您也可以使用preg_match()
preg_match('/.*YO\_\{\s*([^}]*?)\s*\}/s', $variable_where_the_content_is_stored, $m);
print $m[1];
答案 1 :(得分:0)
您可能希望查看递归正则表达式。见http://www.regular-expressions.info/recurse.html。最新版本的php确实支持递归正则表达式。
答案 2 :(得分:0)
你可以实际改变你的正则表达式并使用匹配:
YO_\{[^{}]+\}
[^{}]+
将匹配非{}
个字符。
如果您希望内部文本没有空格,可以使用:
YO_\{\s*([^{}]+?)\s*\}
并提取包含匹配项的数组的第一个元素。
答案 3 :(得分:0)
您可以将此recursive regex pattern与前瞻阴影一起使用:
$str = <<< EOF
YO_{
YO_{
YO_{
McDonalds.
}
}
}
EOF;
if (preg_match('/ YO_ (?!.*?YO_) \{ ( (?: [^{}]* | (?0) )* ) \} /sx', $str, $arr))
echo(trim($arr[1])); // McDonalds.