Как заменить любые скобки на круглые скобки с помощью регулярных выражений? - PullRequest
1 голос
/ 17 июня 2019

Вот код:

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

Это не заменило вообще в этой строке ... Есть ли лучшее кодирование, чем это?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 17 июня 2019

Здесь не нужно регулярное выражение:

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

Или используйте один вызов strtr, но массив будет длиннее.

2 голосов
/ 17 июня 2019

Вы можете использовать

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

Здесь,

  • [{[<] - класс символов соответствует одному из трех символов: {, [ или <
  • []}>] - соответствует одному из трех символов: ], } или > (примечаниечто ] внутри класса символов не нужно экранировать, когда он является первым символом в классе).

См. PHP демо .

Вы также можете использовать один вызов preg_replace_callback:

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

См. эту демонстрацию PHP .

Шаблон ([{[<]) фиксирует начальную пунктуацию вГруппа 1 ($m[1]), и если группа не пуста после того, как найдено совпадение, возвращается (, в противном случае ) заменяется на.

2 голосов
/ 17 июня 2019

Если вам не нужно регулярных выражений , избегайте их.Это может быть сделано простой заменой строки, например

<?php
$string = "{1},[2],(3),<4>";
$string = strtr($string, ['{' => '(', '}' => ')', '[' => '(', ']' => ')', '<' => '(', '>' => ')']);
2 голосов
/ 17 июня 2019

{[< никогда не встречается в вашей строке.Используйте класс символов или необязательную группировку.

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

Альтернативный подход к не символьному классу:

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

https://3v4l.org/URvcb

...