2011-02-10 3 views
1

У меня есть некоторые строки, как Western Australia 223/5 (59.3 ov)PHP регулярные выражения точные данные внутри скобок

Я хотел бы разделить эту строку и извлечь следующую информацию с регулярными выражениями

$team = 'Western Australia' 
$runs = 223/5 
$overs = 59.3 

Издание является, формат текста изменения, это может любой из follwing

  • Западной Австралии 223/5 (59,3 OV)
  • Au stralia 223/5 (59,3 ов)
  • Квазулу-Натал Inland
  • Шри-Ланка v West Indies

Любая помощь (как это возможно, чтобы в одном регулярном выражении) будет понятно ..

+2

В последних двух случаях, каков ожидаемый результат? – BoltClock

+0

BoltClock избил меня. Да ... нужна дополнительная информация! – jerebear

+1

Я не уверен, какой должен быть выход для последних двух! :-) Это может быть полная строка. Я не концентрируюсь на значении вывода, но пытаюсь не получить никаких ошибок при работе с регулярными выражениями –

ответ

5
if (preg_match(
    '%^     # start of string 
    (?P<team>.*?)  # Any number of characters, as few as possible (--> team) 
    (?:\s+    # Try to match the following group: whitespace plus... 
    (?P<runs>\d+  # a string of the form number... 
       (?:/\d+)? # optionally followed by /number 
    )     # (--> runs) 
    )?     # optionally 
    (?:\s+    # Try to match the following group: whitespace plus... 
    \(    # (
    (?P<overs>[\d.]+) # a number (optionally decimal) (--> overs) 
    \s+ov\)   # followed by ov) 
    )?     # optionally 
    \s*     # optional whitespace at the end 
    $     # end of string 
    %six', 
    $subject, $regs)) { 
    $team = $regs['team']; 
    $runs = $regs['runs']; 
    $overs = $regs['overs']; 
} else { 
    $result = ""; 
} 

Вам может понадобиться, чтобы поймать ошибку, если матчи <runs> и/или <overs> не на самом деле присутствует в строке. Я мало знаю о PHP. (Не знаю много биологии ... SCNR)

+0

выглядит правильно .--- – mpen

+0

кто-то является поклонником крикета ... – beggs

+0

[Krikkit] (http://hitchhikers.wikia.com/wiki/Krikkit)? –

1

Предполагая, что вы используете preg_match, вы можете использовать следующее:

preg_match('/^([\w\s]+)\s*(\d+\/\d+)?\s*(\(\d+\.\d+ ov\))?$/', $input, $matches); 

Затем вы можете проверить $matches, чтобы увидеть, какой из вариантов вы supossed управлять было найденный.

Для получения дополнительной информации см. preg_match documentation.

+0

Не получится. «Западная Австралия» - это 2 слова, а не одна. Кроме того, он не будет соответствовать() s вокруг ov-бит. – mpen

+0

Вы правы. Я изменил выражение – elitalon

Смежные вопросы