2015-03-11 4 views
0

Got эта строка:Регистрация двух регулярных выражений или сделать то же самое в то же регулярное выражение

<td>26/02/2015</td><td>09:00</td><td>26/02/2015</td><td>12:00</td><td>3</td><td>I1/121</td><td>10074 codification</td><td>103126 Codification, Cooperation and development - 11</td><td>Walter Shelter, Mary; Johnson Smith, Robert; Dickinson Queen Patty</td><td>without group</td> 

И я хочу, чтобы извлечь следующую информацию:

02 103126-11 Walter Johnson Dickinson 

Я могу понять, как получить 02 103126-11 Walter часть с регулярным выражением:

$nodup_filtertoexec = preg_match('/\d{2}\/(\d{2})\/\d{4}.*?\d+\s.*?(\d+)\s.*?-\s(\d+).*?(?:.*?<td>){1}([a-zA-ZñÑ]+).*/m', $filtered, $matches); 

Таким образом, проблема, я не могу понять, как получить первое значение фамилии часть адреса очень второе значение до ;.

Вот ссылка на regex101 с фактическим регулярное выражение regex to get 02 103126-11 Walter values

Регулярное выражение, чтобы получить три фамилий:

(?:(?<=^)|(?<=;))\w+ 

Вот regex101 пример:

regex to get the Walter Johnson Dickinson values

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

UPDATE: Вот моя последняя попытка, не работает, как ожидалось еще. Только нужно знать, как итерировать последнюю часть регулярного выражения, чтобы получить «Proof» и «Prooftwo» или «Proofthree» (если есть) и т. Д. Из html. Любая помощь будет оценена.

Я тестировал (? < =;) и (? =;) Без везения.

https://regex101.com/r/oQ1fJ1/4

+1

Вы не можете получить данные непосредственно из источника? Извлечение материала из HTML может быть утомительным и, если оно изменено, даже ненадежным. –

+0

@ SverriM.Olsen благодарит за ваш ответ. Материал из HTML не изменится, но будет меньше или больше значений фамилий. Например: Уильямс Смит, Тимоти; Дойл Бирн, Самуил; Туле Мерфи, Александра; Мюррей Нейл, Джек; Cullen Farrell, Jayden – user3321425

ответ

1

Я сделал несколько тестов, и это работает, если у вас есть 3 слова, чтобы получить:

\d{2}\/(\d{2})\/\d{4}.*?\d+\s.*?(\d+)\s.*?-\s(\d+).*?(?:.*?<td>){1}([a-zA-ZñÑ]+)[^;]+; ([a-zA-ZñÑ]+)[^;]+; ([a-zA-ZñÑ]+) 

Ключевым моментом является то, чтобы это получить первое слово после ;:

{1}([a-zA-ZñÑ]+)[^;]+; ([a-zA-ZñÑ]+)[^;]+; ([a-zA-ZñÑ]+) 

https://regex101.com/r/tM9nW3/1

Вы c c ourse может группировать их (regex){2}, если вы считаете, что количество элементов не будет статическим.

+0

Спасибо! Слова не всегда 3. Они являются переменными на каждой итерации. – user3321425

+0

См. Http://stackoverflow.com/a/25986662/1983854 -> «У вас не может быть неизвестного количества групп захвата». Таким образом, вы должны захватить все, а затем разделить его. – fedorqui

+0

@ferdoqui Ничего себе, это не так просто, как я думал. У меня есть в конце группы фамилий. Может ли это чем-то помочь? – user3321425

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