Как получить <span>строку вывода, зная его innerhtml в php? - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь получить строковую структуру между элементом <span>, когда он содержит текст "Bonkers".

Например:

  <span>    Bonkers </span> 

или

 <span>    Bonkers           </span> 

или

<span>              Bonkers                          </span>

Дело в том, что я не знаю структуру пролета, но я знаю, что там будут "Bonkers".

Я хочу вернуть всю текстовую строковую структуру (включая теги open и close), чтобы позже я мог ее заменить. например:

$spanwithbonkers  = '<span>      Bonkers                      </span>';

Пока это то, что у меня есть, но оно не работает:

 <?php

 $homepage = file_get_contents('http://www.example.com/');

  preg_match('/^<span>^Bonkers^</span>/', $homepage, $matches);

  $spanwithbonkers = $matches[0]);


?>

Не уверен, что preg_match даже предполагается использовать.

1 Ответ

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

Лучший способ, чем использование регулярных выражений для разбора HTML, - это использование классов DOMDocument и DOMXPath. Вы можете загрузить HTML в документ, затем использовать XPath для поиска определенных элементов и затем обработать эти элементы. В вашем случае мы находим промежутки, включающие слово Bonkers, сравнивая значение text каждого узла пролета, например,

$html = '<body><div><div><span id="b">    Bonkers  </span></div></div>
         <div><span> no bonk</span>
              <span> This is bonkers!</span>
         </div></body>';
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$spans = $xpath->query("//span[contains(text(), 'Bonkers')]");
foreach ($spans as $span) {
    echo $span->C14N();
}

Выход:

<span id="b"> Bonkers </span>

Если вы хотите сделать сравнение без учета регистра, оно немного сложнее:

$spans = $xpath->query('//span');
foreach ($spans as $span) {
    if (stripos($span->textContent, 'Bonkers') !== false) {
        echo $span->C14N() . "\n";
    }
}

выход

<span id="b"> Bonkers </span> 
<span> This is bonkers!</span>

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

...