2014-07-08 4 views
0

Мне нужно удалить внешние скобки строки, но не внутренние.PHP Удалить скобки за пределами строки

Например:

"(-58)"   -> "-58" 
"('test')"  -> "'test'" 
"('st())"  -> "st()" 
" (hd)h(l()) " -> "hd)h(l() " --> removed all chars up to the bracket 

Надеюсь, вы можете увидеть, что я имею в виду.

Я знаю, как удалить все скобки внутри строки, но не уверен, как удалить только первый и последний. Я также нуждаюсь в нем, чтобы удалить все символы вверх до скобки, так как может быть пробел до/после скобки, который я не хочу.

Любая помощь была бы принята с благодарностью.

+0

Вы хотите удалить пробелы только до/после скобок или всех символов? – ErwinOkken

ответ

2

Один из способов - использовать preg_replace(). Это регулярное выражение заменяет начальные и конечные скобки (только один) и пробелов в соответствии с вашими примерами:

/(^\s*\()|(\)\s*$)/ 

Вы можете использовать его как это:

$string = ' (hd)h(l()) '; 
$pattern = '/(^\s*\()|(\)\s*$)/'; 
$replacement = ''; 
echo preg_replace($pattern, $replacement, $string); // Output: "hd)h(l() " 
+0

Является ли регулярный эксперимент жестким, чтобы опереться? Я собираюсь это изучить. – M98

+0

@ Kermani Я рекомендую эту книгу: http://shop.oreilly.com/product/9780596528126.do –

-1

Вы можете использовать накладку() функции, как показано ниже

$a="(-58)"; 
    $str=trim($a,"()"); 
    echo $str; 
0

Использование php's trim() может привести к неожиданному пересогласованию. Рассмотрим следующую реализацию:

$strings=[ 
    "(-58)",    // -> "-58" 
    "('test')",   // -> "'test'" 
    "('st())",    // -> "st()" 
    " (hd)h(l()) ",  // -> "hd)h(l() " --> removed all chars up to the bracket 
    " ((2x parentheses))" // -> assumed to be "(2x parentheses)" 
]; 

foreach($strings as $s){ 
    // use double trim() to strip leading/trailing spaces, then parentheses 
    var_export(trim(trim($s,' '),'()')); 
    echo "\n"; 
} 

Выход:

'-58' 
'\'test\'' 
'\'st' 
'hd)h(l() ' 
'2x parentheses' // notice this string had two sets of parentheses removed! 

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

Учитывая следующие входные данные:

(-58) 
('test') 
('st()) 
(hd)h(l()) 
((2x parentheses)) 

модель Gergő будет точно заменить нужные символы с и пустой строкой в ​​261 шагов.

Я хотел бы предложить более эффективный и короткий шаблон с эквивалентной точностью с учетом строк выборки OP.

Demo Link

Улучшения:

  1. Захват группы не требуется для трубы, чтобы отделить две альтернативы. (повышает эффективность и краткость)
  2. Заменить символ пробела \s с буквальным пробелом. (улучшает краткость * и потенциальную точность)
  3. Уменьшить квантификатор в пробелах от zero or more до zero or one.(более буквально для выборочных данных)
Смежные вопросы