2009-03-14 2 views
2

У меня есть сценарий, где мне нужно получить три части из текстовой строки и вернуть их в массив. После нескольких попыток и неудач я не смог заставить его работать.Можете ли вы помочь мне сделать это регулярное выражение?

Текстовые строки могут выглядеть следующим образом:

Some place 
Some place (often text in parenthesis) 
Some place (often text in parenthesis) [even text in brackets sometimes]

Мне нужно разделить эти строки на три:

{Some place} ({often text in parenthesis}) [{even text i brackets sometimes}]

Который должен вернуться:

1: Some place 
2: often text in parenthesis 
3: even text in brackets sometimes

Я знаю, что это должно быть простой задачей, но я не мог решить правильное регулярное выражение. Это должно использоваться в PHP.

Заранее благодарен!

+0

Скобки и скобки всегда бывают одного порядка? –

ответ

2

Попробуйте что-то вроде этого:

$result = preg_match('/ 
^([^(]+?) 
    (\s* \(([^)]++) \))? 
    (\s* \[ ([^\]]++) \])? 
    \s* 
    $/x', $mystring, $matches); 

print_r($matches); 

Обратите внимание, что в этом примере, вы, вероятно, будет больше всего заинтересован в $ матчей [1], $ матчей [3], а $ [5].

+0

Работал как очарование! Благодаря! –

1

Разделите проблему на три регулярных выражения. После первого, где вы получите каждый символ перед первой скобкой, сохраните свою позицию - то же самое, что и длина строки, которую вы только что извлекли.

Затем на втором шаге выполните то же самое, но возьмите все до закрывающей круглой скобки. (Вложенные круглые скобки делают это немного сложнее, но не слишком много.) Снова сохраните указатель на конец второй строки.

Получение третьей строки тогда тривиально.

1

Я бы предположил, что это три регулярных выражения, начиная с обеих скобок и скобок и возвращаясь к меньшему количеству элементов, если это не удастся.

^(.*?)\s+\((.*?)\)\s+\[(.*?)\]\s+$ 

если он терпит неудачу, то попробуйте:

^(.*?)\s+\((.*?)\)\s+$ 

, если это также не удается, попробуйте:

^\s+(.*?)\s+$ 

Я уверен, что они могут быть объединены в одно регулярное выражение, но я Wouldn» Попробуйте.

1

Что-то вроде этого?

([^(]++)(?: \(([^)]++)\))?(?: \[([^\]]++)\])? 
Смежные вопросы