PHP preg_replace从方括号之间删除所有点字符

时间:2018-07-17 07:09:15

标签: php regex preg-replace

如何使用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)

3 个答案:

答案 0 :(得分:2)

您可以使用

'~(?:\G(?!^)|\[)[^][.]*\K\.~' # For [strings]
'~(?:\G(?!^)|<)[^<>.]*\K\.~'  # For <strings>

或者,要确保附近有一个],请提前添加(?=[^][]*])

'~(?:\G(?!^)|\[)[^][.]*\K\.(?=[^][]*])~' # For [strings]
'~(?:\G(?!^)|<)[^<>.]*\K\.(?=[^<>]*])~'  # For <strings>

请参见the regex demoregex demo with lookahead

详细信息

  • (?:\G(?!^)|\[)-[或上一次成功匹配的结尾
  • [^][.]*-除[].以外的0个以上的字符
  • \K-匹配重置运算符
  • \.-一个点
  • (?=[^][]*])-一个正向的超前查询,需要在当前位置右侧的]]之外的任意0个字符之后加上[

PHP demo

$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);