【问题标题】:PHP preg_replace remove all dot character from between square bracketsPHP preg_replace 删除方括号之间的所有点字符
【发布时间】:2018-07-17 07:09:14
【问题描述】:

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

【问题讨论】:

  • :-) 正确的说法是什么?
  • @SaadSuri:有人拒绝您的答案可能是有原因的 - 它太简单了,真的,并且也会匹配 [] 之外的点(可能不是OP想要什么)。此外,字符类中的点不需要转义 - [.] 完全可以。
  • @Jan 哦抱歉没看那部分谢谢

标签: php regex preg-replace


【解决方案1】:

你可以使用

'~(?:\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);

【讨论】:

  • 如何修改以匹配尖括号?适用于[],但我很难让它与&lt;&gt; 一起使用
  • @Norman [...]&lt;...&gt;?还是两个独立的模式?如果您的值不能包含&lt;&gt;[],请使用'~(?:\G(?!^)|\[|&lt;)[^][&lt;&gt;.]*\K\.~'。由于这些值是标识符,我认为这个解决方案会起作用。
  • 两种不同的模式。我将使用一个 preg_replace 用于方括号,另一个用于尖括号。
【解决方案2】:

你可以使用\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

【讨论】:

  • 可以添加关闭] 吗?所以它只适用于[]之间的文本现在它甚至替换了字符串中的其他....
  • 好的。您的解决方案工作正常。如果需要它以匹配尖括号,我需要更改什么?
【解决方案3】:

使用回调

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-19
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多