- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
标签内保留换行符?
我目前正在使用 PHP 和 DOMXPath
获取所有 <p>
的内容网页元素:
<?php
...
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$paragraphs = $xpath->evaluate("/html/body//p");
foreach ($paragraphs as $paragraph){
echo $paragraph->textContent . "<br />";
}
我的问题是 textContent
产生的字符串不尊重<br />
<p>
中存在的标签元素。相反,它删除了换行符并将通常位于不同行上的单词放在一起。例如:
示例 HTML:
<p>
Some happy talk goes here talking about our great product.<br />
We would love for you to buy it!
</p>
<p>
Random information and what not<br />
Isn't that cool?
</p>
上面 PHP 的当前输出:
Some happy talk about our great product.We would love for you to buy it!
Random information and what notIsn't that cool?
我试过了$paragraphs = $doc->getElementsByTagName("p");
以及它给了我同样的东西。
有没有办法让 DOMXPath/DOMDocument 保留换行符?我需要能够分隔段落中的每个单词,而当前的输出不允许这样做。
如果有其他方法可以检索 <p>
中的字符串元素同时保留<br />
或 '\n'
那也太好了。
编辑
经过进一步调查,有问题的 HTML 实际上是一个由 <br>
分隔的 anchor 列表。标签但没有实际的换行符:
<p class="home_page_list"><a href="/home/personal-banking/checking/Category-Page-Classic-Checking/classic-checking.html">Classic Checking</a><br> <a href="/home/personal-banking/checking/Category-Page-Interest-Checking/interest-checking.html">Interest Checking</a><br> <a href="/home/personal-banking/checking/Category-Page-Interest-Checking/interest-premium-checking.html">Premium Checking</a><br> <a href="/home/personal-banking/Savings-Category-Page/Basic-Savings-Category-Page/basic-savings.html">Savings Plans</a><br> <a href="/home/personal-banking/Savings-Category-Page/Money-Market-Accounts-Category-Page/money-market-accounts.html">Money Market Accounts</a><br> <a href="/home/personal-banking/Savings-Category-Page/Certificates-of-Deposit-Category-Page/fixed-rate-CD.html">CDs</a><br> <a href="/home/personal-banking/Savings-Category-Page/Individual-Retirement-Account-Category-Page/individual-retirement-account.html">IRAs</a></p>
事实证明,这适用于给定的原始 HTML。
更新:已解决
在@ircmaxell 的回答以及@netcoder 和@Gordon 留下的评论的帮助下,这个问题已经解决了,它不是很优雅,但现在就可以了。
例子:
foreach ($paragraphs as $paragraph){
$p_text = new DOMDocument();
$p_text->loadHTML(str_ireplace(array("<br>", "<br />"), "\r\n", DOMinnerHTML($paragraph)));
//Do whatever, in this case get all of the words in an array.
$words = explode(" ", str_ireplace(array(",", ".", "&", ":", "-", "\r\n"), " ", $p_text->textContent));
print_r($words);
}
这利用了 DOMinnerHTML (如@netcoder 所建议)替换 <br>
的实例使用“\r\n”(如@ircmaxell 所建议),然后可以在 textContent.
后对其进行评估
显然还有一些改进的余地,但它已经解决了我当前的问题。
感谢大家的帮助,
本
最佳答案
好吧,我要做的是用文字换行符替换换行符:
$doc = new DOMDocument();
$doc->loadHTML($html);
$brs = $doc->getElementsByTagName('br');
foreach ($brs as $node) {
$node->parentNode->replaceChild($doc->createTextNode("\r\n"), $node);
}
$xpath = new DOMXPath($doc);
$paragraphs = $xpath->evaluate("/html/body//p");
foreach ($paragraphs as $paragraph){
echo $paragraph->textContent . "<br />";
}
关于php - 使用 DOMXPath 在 <p> 标签内保留换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4739896/
如何在不再次查询整个文档的情况下查询子元素的 xpath 结果? 我查询我的文档以找到最后一个 同类menu-item : $doc = new DomDocument(); @$doc->loadH
正在尝试确定哪个更适合我的用例... 对比了这些方法的文档,我模糊的理解是evaluate返回类型化结果但 query没有。此外,query示例包括遍历许多结果,但 evaluate示例假定单一类型的
我面临一个我无法解决的问题。我正在使用 DOMXPath检索 MsgId 的值以下 XML 文件的标记: Test/20171013/CCT10
我这里有一些例子: Mortal Combat: A very good gamenbsp; Call of Duty: Don't buy this game. Street Fighte
到目前为止,我的代码正在使用 xPath 查询获取所有类“forumRow”。如何获得在每个“forumRow”类中存在一次的 a 元素的 href 属性? 我有点卡在我可以从第一个查询的结果开始运行
XML 文件: Root element 4 1 5 3 6
我有这段代码并使用 DOMXPath 删除给定的 td $html = file_get_contents('WebProxy.html'); $xml = new DOMDocument(); $x
我正在使用 DOMDocument/DOMXPath 尝试使 CSS 内联。它会完美地工作,除非我传递给它的 HTML 使它出错,说它不是有效的 XML。 如何设置这些函数来忽略未知标签? 无论如何,
我昨天问了这个问题,当时这正是我所需要的,但是在处理一些实时数据时我发现它并没有完全按照我的预期进行。 Parse HTML with PHP's HTML DOMDocument 它从 HTML 页
假设我有这个: CCC sometexthere AAA sometext DDD something 现在,我想获取 baz 值,它紧跟在
当我想用 XPath 打印计算表达式的结果时出现错误。 $url = $xpath->evaluate('//a/@href', $event);回显 $url ; 我有这个错误:可捕获的 fatal
我有这个 HTML 代码: Hello World 我这样做:$res = $xpath->query(//div[@class='lvlone']/div[@
我有以下html表格结构
我有以下结构: ... ... 问题:基于“输入”标签的“名称”属性选择该tr的表达式是什么?更具体地说,我想知道是否有一种方法,而不必选择输入,然后执行-> parentNode->
当前结构看起来像 //more html //more html //more html //more html
我一直在尝试编写一个 PHP 脚本来使用 DOMXPath 解析 XML 文档。 ;然而我似乎遗漏了一些东西,因为我的 XPath 查询都没有返回任何内容。因此,我尝试淡化我的脚本来尝试解析一个非常基
鉴于此示例文档片段: 300
我使用 DOMXPATH 从 p 标记中删除所有 属性,并且工作正常, // Loop all p. foreach( $dom->getElementsByTagName( "p" ) as $p
我有一段 HTML 代码: Submit 如何在 PHP 中使用 DOMXPath 提取隐藏输入的值?我试过这样的事情: //$site - the html code $doc = n
伙计们,我正在解析 URL 以获取 HTML dom 元素。 这是我的代码: loadHTMLFile($url); $xp = new DOMXPath($dom); $qry = '//scrip
我是一名优秀的程序员,十分优秀!