У меня возникли проблемы с получением этих данных:
<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 (), а также после поиска информации, которую вы хотели.