如何使用正则表达式替换圆括号中的任何括号?

时间:2019-06-17 18:03:03

标签: php regex string preg-replace

这是代码:

$string="{1},[2],(3),<4>";
// Replaces closing square, curly, angle brackets with round brackets
$string = preg_replace('/\{\[\</', '(', $string);
$string = preg_replace('/\}\]\>/', ')', $string);

它根本没有替换掉那个字符串...比那更好的编码了吗?

谢谢。

4 个答案:

答案 0 :(得分:2)

{[<永远不会出现在您的字符串中。使用字符类或可选分组。

$string = preg_replace('/[{[<]/', '(', $string);
$string = preg_replace('/[}>\]]/', ')', $string);

非字符类的替代方法:

$string = preg_replace('/(?:\{|<|\[)/', '(', $string);
$string = preg_replace('/(?:\}|>|\])/', ')', $string);

https://3v4l.org/URvcb

答案 1 :(得分:2)

您可以使用

$string="{1},[2],(3),<4>";
$what = ['~[{[<]~', '~[]}>]~'];
$with = ['(', ')'];
$string = preg_replace($what, $with, $string);
echo $string;

在这里

  • [{[<]-与三个字符之一匹配的character class{[<
  • []}>]-匹配三个字符之一:]}>(请注意,字符类中的]不必是当它是课程中的第一个字符时逃脱了。

请参见PHP demo

您也可以使用一次致电preg_replace_callback

$string = preg_replace_callback('~([{[<])|[]}>]~', function ($m) {
    return !empty($m[1]) ? "(" : ")";
 }, $string);

请参见this PHP demo

([{[<])模式将开始标点符号捕获到组1($m[1])中,如果找到匹配项后该组不为空,则返回(,否则返回{{1 }}替换为。

答案 2 :(得分:2)

除非您需要正则表达式,否则请避免使用它们。这可以通过简单的字符串替换来完成,例如

<?php
$string = "{1},[2],(3),<4>";
$string = strtr($string, ['{' => '(', '}' => ')', '[' => '(', ']' => ')', '<' => '(', '>' => ')']);

答案 3 :(得分:2)

这里不需要正则表达式:

$string = str_replace(['{','[','<'], '(', str_replace(['}',']','>'], ')', $string));

或使用一次对strtr的调用,但数组将更长。