我已经潜伏着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
答案 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);