PHP preg_replace删除方括号中的所有点字符

PHP preg_replace删除方括号中的所有点字符,php,regex,preg-replace,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][c

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

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

详细信息

  • (?:\G(?!^)\[)
    -a
    [
    或上一次成功匹配的结束
  • [^][.]*
    -除
    [
    ]
    以外的任何0+字符
  • \K
    -匹配重置运算符
  • \。
    -一个点
  • (?=[^][]*])
    -一种正向前瞻,要求在当前位置右侧的任何0+字符之后,除
    ]
    [
    之外,立即添加
    ]
:


您可以使用中的
\G

(?:\G(?!\A)|\[)
[^\].]*\K\.
请参阅(注意详细模式)。
分解后,这表示:

(?:
    \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
使用回调

$str = preg_replace_callback('/\[[^]]*\]/', function($m){
    return str_replace(".", "", $m[0]);
}, $str);

:-)什么是正确的术语?@SaadSuri:可能有人对你的答案投了反对票,这是有原因的——它太简单了,而且会匹配
[
]
之外的点(这可能不是OP想要的)。此外,点不需要在字符类中转义-
[。]
完全可以。@Jan Oh抱歉没有读到这一部分,是否添加了结束语
]
?因此,它只适用于
[
&
]
之间的文本,现在它甚至取代了字符串中的其他
…Ok。你的解决方案很好用。如果需要它来匹配角括号,我需要更改什么?如何修改它以匹配角括号?对
[
&
]
很好,但我正在努力让它与
@Norman都
[…]
?还是两种不同的模式?如果您的值不能包含
[
]
,请使用。由于这些值是标识符,我认为这个解决方案会起作用。我将用一个preg_替换方括号,另一个替换角括号。@Norman如果这些是识别符,
(?:
    \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
$str = preg_replace_callback('/\[[^]]*\]/', function($m){
    return str_replace(".", "", $m[0]);
}, $str);