Получение внутреннего текста тегов HTML с помощью регулярных выражений - PullRequest
0 голосов
/ 18 декабря 2008

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

              <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>

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 18 декабря 2008

Если я вас правильно понимаю, вас интересует только текст между тегами 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 = "";
}
0 голосов
/ 05 октября 2009

Похоже на screenscraping , или вы можете использовать strip_tags () также после поиска нужной информации.

0 голосов
/ 18 декабря 2008

Кажущийся произвольным ответ переполнения стека на подобные вопросы выглядит так: «О боже, не используйте регулярные выражения! Лично я предпочитаю не использовать внешние библиотеки для небольших задач, подобных этой, и регулярные выражения - хорошая альтернатива.

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

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

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

Несоответствующие группы похожи на это: (?:this won't match)

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