xPath删除<br/>并将多行文本推入一个数组

时间:2018-05-19 16:56:48

标签: php xpath

我已经潜伏着Stackoverflow几个小时的可能答案,虽然我找到了一些解决方案,但在我的情况下都没有。

我需要获取div的文本并通过foreach循环运行它,最终为每个div内容创建一个新的数据库记录。

一切正常,直到我面对包含多行内容和<br>标记的div。

我试过了:

$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

没有&#34;作者&#34;在数组中,在这种情况下应该是&#34;特斯拉&#34;。

好的数组应该如何显示:

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

1 个答案:

答案 0 :(得分:1)

当你的xpath查询运行时,最后一部分要求分别提取每个文本节点(表达式末尾的//text()位)。相反,你只需要整个元素的文本。使用DOM,每段文本都是一个单独的节点,所以

Quote line 0,
<br>Quote line 1,

是两个单独的文本节点。您的查询正在检索此内容(如您所见)为2个元素。

所以使用

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

应该给你所有的文字。文本中会有换行符,所以你可以做...

$dataArr[] = str_replace("\n", " ", $quote);