Preg Match Help - Найти содержимое тега с неизвестными классами - PullRequest
0 голосов
/ 19 октября 2018

Я знаю, что это возможно, но из-за своей жизни я не могу с этим справиться.

Рассмотрим этот сценарий:

$html = '<tr>
    <td>Some Marker I know<td>
    <td>This is what I want</td>
<tr>

Так что preg_match будет выглядеть примерно так:

preg_match_all( '#Some Marker I know<td><td>(.*?)</td>#', $html, $match );

Однако я не могу быть уверен в некоторых вещах, и поэтому мне нужен Somethign, который обеспечивает большую гибкость

Пример:

$html = '<tr class='unknown another' id='no idea'>
    <td attribute='no idea' class='no idea'>Some Marker I know<td>
    <label>This is what I want</label>
<tr>

Обратите внимание, что я изменил:- Классы и ID - которые могут существовать или не существовать - HTML-теги - которые могут не быть TD (могут быть DIV), но всегда будут следующими.

Итак, чтобы было ясно, что я хочу получитьэто строка «Это то, что я хочу»

В английском языке термин поиска будет выглядеть примерно так:

  • Получите мне содержимое следующего тега / элемента
  • Где содержимое предыдущего элемента: «Какой-то маркер, который я знаю»
  • Но там, где промежуточные теги могут (или не могут) иметь классы, идентификаторы и т. Д.

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

Спасибо!

1 Ответ

0 голосов
/ 19 октября 2018

Мой предпочтительный способ обработки HTML в PHP - использование класса DomDocument.После того, как вы прочитали свой HTML в DomDocument, вы можете использовать DomXPath для поиска.В этом случае мы хотим искать элемент после того, который имеет текстовое значение Some Marker I know.XPath для этого:

//*[text()="Some Marker I know"]/following-sibling::*

Мы можем использовать это в PHP следующим образом:

$html = "<tr class='unknown another' id='no idea'>
    <td attribute='no idea' class='no idea'>Some Marker I know<td>
    <label>This is what I want</label>
<tr>";
$doc = new DomDocument;
$doc->loadHTML($html);
$xpath = new DomXPath($doc);
$marker = $xpath->query('//*[text()="Some Marker I know"]/following-sibling::*');
echo(trim($marker[0]->nodeValue));

Вывод:

This is what I want

Демонстрация на 3v4l.орг

...