xPath удалить <br>и вставить многострочный текст в один массив - PullRequest
0 голосов
/ 19 мая 2018

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

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

Все работает, пока я не сталкиваюсь с div с многострочным контентом и <br> тегами.

Я пробовал:

$quotes = $finder->query("//*[contains(@class, normalize-space('$quote'))]//text()");

Но это не похоже на normalize-space() имеет какой-либо эффект, потому что вместо того, чтобы помещать весь текст в один массив, вместо каждого <br> создается новый массив.

Больше кода:

$quotes = $finder->query("//*[contains(@class, normalize-space('$quote'))]//text()");
$authors = $finder->query("//*[starts-with(@class,'$author')]/child::a");

    foreach ($quotes as $key => $quote) {
        {
            $quote = trim($quote->textContent);
            $dataArr[] = $quote;
            $authorName = preg_split("/[\s,-,@]+/", $authors[$key]->textContent);

            if (count($authorName) < 5) {
                $authorName = $authorName[1];
            } else if (count($authorName) > 5) {
                $authorName = $authorName[1] . ' ' . $authorName[2] . ' ' . $authorName[3];
            } else if (count($authorName) > 6) {
                $authorName = $authorName[1] . ' ' . $authorName[2] . ' ' . $authorName[3] . ' ' . $authorName[4];
            } else {
                $authorName = $authorName[1] . ' ' . $authorName[2];
            }
            array_push($dataArr, $authorName);
    }

Структура HTML, которая извлекаетсяправильно:

<div class="b-list-quote2__item "><a href="/" class="b-list-quote2__item-text js-quote-text">
    A random quote here...
</a><div class="b-list-quote2__item-category">
    <a href="/quotes/albert-einshtein?q=17856">Albert Einstein</a>

В этом случае я получаю массив с цитатой и автором, который позже делю на 2 и использую в других функциях

[0] => A random quote here... [1] => Albert Einstein

Структура HTML У меня проблема с:

<div class="b-list-quote2__item "><a href="/" class="b-list-quote2__item-text js-quote-text" style="position: relative; max-height: none;">
    Quote line 0,
    <br>Quote line 1,
    <br>Quote line 2,
    <br>Quote line 3,
</a><div class="b-list-quote2__item-category">
    <a href="/quotes/karmelita-kruglaia?q=249176">Tesla</a>

В этом случае для каждой строки текста добавляется новый элемент массива, что-то вроде

[0] => Quote line 0 [1] => Quote line 1 [2] => Quote line 2 [3] => Quote line 3

Без «автора» в массиве, который в данном случае должен быть «Тесла».

Как должен выглядеть хороший массив:

[0] => Quote line 0 Quote line 1 Quote line 2 Quote line 3 [1] => Tesla

1 Ответ

0 голосов
/ 19 мая 2018

Когда ваш запрос xpath выполняется, последняя часть запрашивает каждый из текстовых узлов для извлечения отдельно (бит //text() в конце выражения).Вместо этого вы просто хотите текст всего элемента.В DOM каждый фрагмент текста представляет собой отдельный узел, поэтому

Quote line 0,
<br>Quote line 1,

- это два отдельных текстовых узла.Ваш запрос извлекает это (как вы нашли) как 2 элемента.

Таким образом, использование

$quotes = $finder->query("//*[contains(@class, normalize-space('$quote'))]");

должно дать вам весь текст.Текст будет содержать разрывы строк, так что вы можете сделать ...

$dataArr[] = str_replace("\n", " ", $quote);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...