2013-07-05 3 views
2

Есть ли лучший и эффективный способ, чем следовать для форматирования пробелов вокруг скобок? Возможно ли слияние в RegEx?Форматирующие кронштейны

$string = '(dd  ) ads   [d]'; 
$string = preg_replace([ 
     '#\s*(“)\s*([^”]+?)\s*?(”)\s*#u', 
     '#\s*(«)\s*([^»]+?)\s*?(»)\s*#u', 
     '#\s*(\()\s*([^)]+?)\s*?(\))\s*#u', 
     '#\s*(\{)\s*([^}]+?)\s*?(\})\s*#u', 
     '#\s*(\[)\s*([^\]]+?)\s*?(\])\s*#u', 
    ], 
    ' \1\2\3 ', $string); 
echo trim($string); //(dd) ads [d] 

Он преобразует эти: a (b) c, a(b)c, a( b)c и a ( b)c к a (b) c.

+3

Можете ли вы привести примеры того, что вы делаете? Трудно скомпилировать регулярные выражения в вашей голове. – user4035

+0

Можете ли вы привести пример? –

+0

Я не думаю, что это будет работать, когда у вас есть вложенные скобки, он будет обрабатывать только самые сокровенные. – Barmar

ответ

0

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

$string = preg_replace('#\s*(?:(\[)\s*([^]]+?)\s*?(\])|' . 
           '(\{)\s*([^}]+?)\s*?(\})|' . 
           '(\()\s*([^)]+?)\s*?(\))|' . 
           '(«)\s*([^»]+?)\s*?(»)|' . 
           '(“)\s*([^”]+?)\s*?(”))\s*#u', 
         ' \1\2\3\4\5\6\7\8\9\10\11\12 ', $string); 
0

Используйте [...] набор.

Должно ли следующее недостаточно (отсутствие сопряжения)?

$string = preg_replace('#\s*([\[\{\(«“])\s*#u', ' \1', $string); 
$string = preg_replace('#\s*([\]\}\)»”])\s*#u', '\1 ', $string); 
Смежные вопросы