2016-08-27 5 views
-1

У меня есть два типа выражений:PHP: необязательная группа записи

  • AbC
  • а (объяснение)

Я хотел бы быть в состоянии захватить как основного текст и пояснение [в скобках], если имеется.

Я пытаюсь использовать следующее регулярное выражение:

preg_match("/(.*?)\\s*(\\(.*\\))*/u", $text, $matches); 

Но это не работает. Как мне заставить его работать?

+0

в кавычки или скобки? – revo

+0

@revo В круглых скобках. Tnx за внимание! –

+1

'preg_match_all ("/([^ (] +) \\ s * (\\ (. * \\))?/U "," abc (test) \ nabc ", $ matches);' https: // 3v4l.org/FLB0S –

ответ

1

Если вы работаете с Java, у вас есть эта привычка, чтобы выровнять регулярное выражение, но вы должны знать, что PHP отличается таким образом: вам не нужно.

Причина, по которой ваше регулярное выражение возвращает пустой результат, заключается в том, что двигатель выполняется на самом первом этапе: (.*?).

Возможно, вы захотите изменить его на ([^(]+)(\(.*\))?, который не использует ленивую или жадную точку квантора . (останавливается в правильном положении). Если abc часть всегда содержит символы слова [a-zA-Z0-9_], то есть лучший образец следовать: (\w+)\s*(\(.*\))?

Я не уверен, что используется u модификатора юникода. Если вам это действительно нужно, добавьте его.

preg_match("/(\w+)\s*(\(.*\))?/", "abc (explanation)", $matches); 
var_dump($matches); 

Выход:

array(3) { 
    [0]=> 
    string(17) "abc (explanation)" 
    [1]=> 
    string(3) "abc" 
    [2]=> 
    string(13) "(explanation)" 
} 

Live demo

+1

Пространство также должно быть необязательным, если в скобках нет. Вы можете использовать неконвертирующую группу: '([^ (] +) (?: \ S + (\ (. * \)))?' – 4castle

+0

Спасибо. Перемещенные пробелы. @ 4castle – revo

+0

Я рекомендовал группу, не связанную с захватом, так что пробелы не будут частью группы захвата, но '\ s *' отлично работает, если пространство не требуется. – 4castle

0

Попробуйте этот код

preg_match("/.*?\s*(\(.*?\))*$/u", $text, $matches) 
Смежные вопросы