Получение внутреннего текста тегов HTML с использованием регулярных выражений

У меня возникли проблемы с получением этих данных:

<tr> <td><span class="bodytext"><b>Contact:</b><b></b></span><span style='font-size:10.0pt;font-family:Verdana; mso-bidi-font-family:Arial'><b> </b> <span class="bodytext">John Doe</span> </span></td> </tr> <tr> <td><span class="bodytext">PO Box 2112</span></td> </tr> <tr> <td><span class="bodytext"></span></td> </tr> <!--********************************************************* --> <tr> <td><span class="bodytext"></span></td> </tr> <tr> <td><span class="bodytext">JOHAN</span> NSW 9700</td> </tr> <tr> <td><strong>Phone:</strong> 02 9999 9999 </td> </tr> 

В принципе, я хочу захватить все после «Contact:» и до «Phone:» минус HTML; однако эти два обозначения могут не всегда существовать, поэтому мне нужно действительно захватить все между двумя двоеточиями (:), которые не находятся внутри тега HTML. Число <span class="bodytext">***data***</span> может действительно измениться, поэтому мне нужен какой-то цикл для их сопоставления.

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

Кроме того, я хотел бы знать синтаксис для несовпадающих групп в PHP regex.

Любая помощь будет принята с благодарностью!

Если я правильно вас понимаю, вас интересует только текст между тегами HTML. Чтобы игнорировать HTML-теги, просто сначала разделите их:

 $text = preg_replace('/<[^<>]+>/', '', $html); 

Чтобы захватить все между «Контакт» и «Телефон:», используйте:

 if (preg_match('/Contact:(.*?)Phone:/s', $text, $regs)) { $result = $regs[1]; } else { $result = ""; } 

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

 if (preg_match('/:([^:]*):/', $text, $regs)) { $result = $regs[1]; } else { $result = ""; } 

Кажется, что произвольный ответ переполнения стека на такие вопросы кажется «omg не использует регулярные выражения! Вместо этого используйте Beautiful Soup !!». Лично я предпочитаю не использовать внешние библиотеки для небольших задач вроде этого, а регулярные выражения – хорошая альтернатива.

Простым способом снять все теги HTML, что является одним из способов решения этой проблемы, является использование этого регулярного выражения:

 $text = preg_replace("/<.*?>/", "", $text); 

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

Не согласующиеся группы выглядят следующим образом: (?:this won't match)

Звучит как скрипинг , или вы можете использовать strip_tags (), а также после поиска информации, которую вы хотели.