如何使用preg_replace删除字符串中两个方括号之间的所有.
字符?
我试图仅替换方括号之间,而不替换字符串中的其他点。这本来可以工作,但是不知何故只是给出了一个空白字符串。如何为此编写正则表达式?
$str = '[city.name][city.state][city.mayor][city.mayor.name](city.name)';
$str = preg_replace('/\[.*?\]/','',$str);
echo $str;
// output
[cityname][citystate][citymayor][citymayorname](city.name)
答案 0 :(得分:2)
您可以使用
'~(?:\G(?!^)|\[)[^][.]*\K\.~' # For [strings]
'~(?:\G(?!^)|<)[^<>.]*\K\.~' # For <strings>
或者,要确保附近有一个]
,请提前添加(?=[^][]*])
:
'~(?:\G(?!^)|\[)[^][.]*\K\.(?=[^][]*])~' # For [strings]
'~(?:\G(?!^)|<)[^<>.]*\K\.(?=[^<>]*])~' # For <strings>
请参见the regex demo和regex demo with lookahead。
详细信息
(?:\G(?!^)|\[)
-[
或上一次成功匹配的结尾[^][.]*
-除[
,]
和.
以外的0个以上的字符\K
-匹配重置运算符\.
-一个点(?=[^][]*])
-一个正向的超前查询,需要在当前位置右侧的]
和]
之外的任意0个字符之后加上[
。$str = '[city.name][city.state][city.mayor][city.mayor.name](city.name)';
echo preg_replace('~(?:\G(?!^)|\[)[^][.]*\K\.~', '', $str);
答案 1 :(得分:1)
您可以按以下方式使用\G
(?:\G(?!\A)|\[)
[^\].]*\K\.
请参见a demo on regex101.com(请注意详细模式)。
(?:
\G(?!\A) # match after the previous match (not the start)
| # or
\[ # [
)
[^\].]* # neither dot nor ]
\K # make the engine forget what's been matched before
\. # match a dot
答案 2 :(得分:1)
使用回调
$str = preg_replace_callback('/\[[^]]*\]/', function($m){
return str_replace(".", "", $m[0]);
}, $str);