php preg_替换模式[[和]]
我似乎无法使我的代码正常工作 考虑一个字符串php preg_替换模式[[和]],php,preg-replace,preg-match,Php,Preg Replace,Preg Match,我似乎无法使我的代码正常工作 考虑一个字符串 $string = "the [[quick [[brown]] fox [jumps]] over the]] lazy dog"; 我想删除[[]中的所有单词,从而得到一个结果“懒惰的狗” 使用preg\u replace('/\[\[(.*?\]\]\]/s',''.$string)将给我一个结果: 懒惰的狗 这是错误的。有人对此有办法吗?试试这个: preg_replace('/\[\[.*\]\]/s', '' ,$string) 操作
$string = "the [[quick [[brown]] fox [jumps]] over the]] lazy dog";
我想删除[[]中的所有单词,从而得到一个结果“懒惰的狗”
使用preg\u replace('/\[\[(.*?\]\]\]/s',''.$string)
将给我一个结果:
懒惰的狗
这是错误的。有人对此有办法吗?试试这个:
preg_replace('/\[\[.*\]\]/s', '' ,$string)
操作上的差异是
(?:\[\[.*?\]\]\].*)*?
。它首先尝试匹配带括号的字符串,而不是*?
,如果匹配失败,它将尝试
使用正则表达式进行匹配。我建议用手来做
function replace_brackets($source) {
$result = '';
$brackets = 0;
foreach (preg_split('/(\[\[|\]\])/', $source, -1, PREG_SPLIT_DELIM_CAPTURE) as $segment) {
if ($segment == '[[') {
$brackets++;
} else if ($segment == ']]') {
$brackets--;
} else if ($brackets == 0) {
$result .= $segment;
}
}
return $result;
}
echo replace_brackets("the [[quick [[brown]] fox [jumps]] over the]] lazy dog [[ta]] da\n");
它是否必须与正则表达式一起使用,或者您是否愿意使用其他方法?如果有一种比正则表达式更快的替代方法,那就太好了。这个表达式是贪婪的,所以它不适用于以下内容:
“快速[[brown]]狐狸[跳过]]懒狗[[还有这个]]”
可能适用于他的示例字符串,但是那棕色的狐狸呢?它将取代太多。这只工作到2级如何的[[quick[[brown]]fox[[jumps[[Other inside]]]]lazy dog
Regex是疯狂的印象,因为它看起来像是你在试图清洁键盘,但实际上确实有东西。@Ralpu,Regex不适合递归的东西。如果你想要额外的级别,你可能需要用php来写。。。除非你想转到.net。net正则表达式实现具有额外的“深度”功能,可用于解决此问题。
function replace_brackets($source) {
$result = '';
$brackets = 0;
foreach (preg_split('/(\[\[|\]\])/', $source, -1, PREG_SPLIT_DELIM_CAPTURE) as $segment) {
if ($segment == '[[') {
$brackets++;
} else if ($segment == ']]') {
$brackets--;
} else if ($brackets == 0) {
$result .= $segment;
}
}
return $result;
}
echo replace_brackets("the [[quick [[brown]] fox [jumps]] over the]] lazy dog [[ta]] da\n");