Разделить HTML документ на слова и интервалы, используя PHP - PullRequest
1 голос
/ 09 апреля 2020

Использование PHP Я хочу разбить документ HTML на отдельные слова, но сохраняя некоторые <span> вместе. Это так близко, как я до сих пор, с минимальным примером HTML (который был бы больше и сложнее в реальности):

$html = '<html><body>

<h1>My header</h1>

<p>A test <b>paragraph</b> with <span itemscope itemtype="http://schema.org/Person">Bob Ferris</span> a person.</p>

</body></html>';

$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);

foreach($xpath->query('.//span[@itemtype]|.//text()[normalize-space()]') as $node) {
    echo $node->nodeType . " " . $node->nodeValue . "<br>";
}

Это выводит:

3 Мой заголовок
3 Тест
3 абзаца
3 с
1 Бобом Феррисом
3 Бобом Феррисом
3 человека.

(nodeType 3 - текстовый узел, 1 - элемент)

Мне также необходимо:

  • Разделить текстовые узлы на отдельные слова и убрать пунктуацию (это легко сделать на этом этапе , но можно ли это сделать в запросе xpath?)
  • захватывать только элемент "Bob Ferris", а не текстовый узел "Bob Ferris".
  • Мне понадобится доступ к атрибутам из них <span> с, с $node->getAttribute()

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Это, кажется, делает это:

// 1: Match all <span>s with an itemtype attribute.
// 2: OR
// 3: Match text strings that are not in one of those spans (and get rid of some spaces).
foreach($xpath->query('.//span[@itemtype]|.//text()[not(parent::span[@itemtype])][normalize-space()]') as $node) {
    if ($node->nodeType == 1) {
        // A span.
        echo $node->nodeValue . "<br>";
    } else {
        // A text node - split into words and trim trailing periods.
        $words = explode(" ", trim($node->nodeValue));
        foreach($words as $word) {
            echo rtrim($word, ".") . "<br>";
        }
    }
}
0 голосов
/ 09 апреля 2020

Просто для удовольствия, один вкладыш с XPath 2.0:

tokenize(replace(replace(concat(string-join((//text()[not(parent::span)][normalize-space()])[position()<last()]|//span[@itemtype],","),replace((//text()[not(parent::span)][normalize-space()])[last()],"\W$","")),"\W+",","),replace(//span[@itemtype]/text(),"\W+",","),//span[@itemtype]/text()),",+")

Вывод:

XPath2

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