2015-07-31 3 views
1

Я пытаюсь разобрать текст с регулярным выражением php. Я написал образец соответствия со всем в строю. Я не хочу этого. Он должен соответствовать цели отдельно в той же строке.PHP Regex сопоставляет шаблон отдельно в той же строке

картина:

/\((?P<type>\w+)((,)*(?P<params>[\d\w\:]+))((,)*(?P<comment>.*))\)/u 

целевая строка данных:

lorem ipsum dolor (photo,61) test (photo,62,some text) (video,63) sit amet etc 

Результаты preg_match_all с флагом PREG_SET_ORDER:

array (size=1) 
0 => 
    array (size=11) 
     0 => string '(photo,61) test (photo,62,some text) (video,63)' (length=47) 
     'type' => string 'photo' (length=5) 
     1 => string 'photo' (length=5) 
     2 => string ',61' (length=3) 
     3 => string ',' (length=1) 
     'params' => string '61' (length=2) 
     4 => string '61' (length=2) 
     5 => string ') test (photo,62,some text) (video,63' (length=37) 
     6 => string '' (length=0) 
     'comment' => string ') test (photo,62,some text) (video,63' (length=37) 
     7 => string ') test (photo,62,some text) (video,63' (length=37) 

Если целевые данные помещаются в отдельные строки и одинаковые результаты выполнения шаблона регулярного выражения; (Я хочу эти результаты, но без новых линий)

lorem ipsum dolor 
(photo,61) test 
(photo,62,some text) 
(video,63) sit amet etc 

array (size=3) 
    0 => 
     array (size=11) 
      0 => string '(photo,61)' (length=10) 
      'type' => string 'photo' (length=5) 
      1 => string 'photo' (length=5) 
      2 => string ',61' (length=3) 
      3 => string ',' (length=1) 
      'params' => string '61' (length=2) 
      4 => string '61' (length=2) 
      5 => string '' (length=0) 
      6 => string '' (length=0) 
      'comment' => string '' (length=0) 
      7 => string '' (length=0) 
     1 => 
     array (size=11) 
      0 => string '(photo,62,some text)' (length=20) 
      'type' => string 'photo' (length=5) 
      1 => string 'photo' (length=5) 
      2 => string ',62' (length=3) 
      3 => string ',' (length=1) 
      'params' => string '62' (length=2) 
      4 => string '62' (length=2) 
      5 => string ',some text' (length=10) 
      6 => string ',' (length=1) 
      'comment' => string 'some text' (length=9) 
      7 => string 'some text' (length=9) 
     2 => 
     array (size=11) 
      0 => string '(video,63)' (length=10) 
      'type' => string 'video' (length=5) 
      1 => string 'video' (length=5) 
      2 => string ',63' (length=3) 
      3 => string ',' (length=1) 
      'params' => string '63' (length=2) 
      4 => string '63' (length=2) 
      5 => string '' (length=0) 
      6 => string '' (length=0) 
      'comment' => string '' (length=0) 
      7 => string '' (length=0) 

Благодарим за помощь.

+1

Я не знаю, что вы имеете в виду – aelor

+0

Что вы имеете в виду без новых линий может вам пожалуйста, уточните –

+0

@Uchiha Например, перейдите к новой строке с помощью клавиши Enter. Программно: \ r \ n. Этот символ доступен, он работает, но я хочу работать, когда это не так. –

ответ

1

Просто используйте вместо

'~\(.*?\)~' 

, и это будет сделано

Regex101 Eval

0

я нашел решение не затрагиваемые новой строки (радикальное решение заключить с "~ ... ~" не использовать "/.../")

~\((\w+),([\d|:]+),*(.*?)\)~u 

имени версии;

~\((?P<type>\w+),(?P<params>[\d|:]+),*(?P<comment>.*?)\)~u 

Спасибо за @Uchiha предварительного решения и спасибо за подсказку данного.

'~\(.*?\)~' 
Смежные вопросы