这是代码:
$string="{1},[2],(3),<4>";
// Replaces closing square, curly, angle brackets with round brackets
$string = preg_replace('/\{\[\</', '(', $string);
$string = preg_replace('/\}\]\>/', ')', $string);
它根本没有替换掉那个字符串...比那更好的编码了吗?
谢谢。
答案 0 :(得分:2)
{[<
永远不会出现在您的字符串中。使用字符类或可选分组。
$string = preg_replace('/[{[<]/', '(', $string);
$string = preg_replace('/[}>\]]/', ')', $string);
非字符类的替代方法:
$string = preg_replace('/(?:\{|<|\[)/', '(', $string);
$string = preg_replace('/(?:\}|>|\])/', ')', $string);
答案 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
的调用,但数组将更长。