Php 将HTML导入DOMDocument或SimpleXML时删除内联元素?

Php 将HTML导入DOMDocument或SimpleXML时删除内联元素?,php,html,parsing,simplexml,domdocument,Php,Html,Parsing,Simplexml,Domdocument,我有一个外部HTML源代码,我想将其刮取并转换为本地XML文件或添加到MySQL数据库 外部源代码大部分是规范化的,并且(在某种程度上)是语义的,因此我所需要做的就是使用XPATH来获取所有td内容或所有li内容等。问题是,偶尔这些项使用或标记来设置我需要的元素的样式 这在技术上是语义上的,因为重点是增加对特定文本的强调,开发人员可能希望使用不是浏览器默认的CSS 问题是我试图获取的实际内容被认为是这个内联元素的子元素,因此像simplexml或DOMDocument和DOMNode这样的PHP

我有一个外部HTML源代码,我想将其刮取并转换为本地XML文件或添加到MySQL数据库

外部源代码大部分是规范化的,并且(在某种程度上)是语义的,因此我所需要做的就是使用
XPATH
来获取所有
td
内容或所有
li
内容等。问题是,偶尔这些项使用
标记来设置我需要的元素的样式

这在技术上是语义上的,因为重点是增加对特定文本的强调,开发人员可能希望使用不是浏览器默认的CSS

问题是我试图获取的实际内容被认为是这个内联元素的子元素,因此像
simplexml
DOMDocument
DOMNode
这样的PHP扩展将它们视为子元素。例如:

<table>
<tr><td>Thing 1</td><td>Thing 2</td></tr>
<tr><td>Thing 3</td><td>Thing 4</td></tr>
<tr><td><strong>Thing 5</strong></td><td><strong>Thing 6</strong></td></tr>
</table>
显然,上面的内容并不是simplexml返回的内容,但上面反映了一般问题

那么,有没有一种方法,可以使用DOMDocument中已经内置的参数,或者使用一个非常复杂的XPath查询来获取
td
元素的内容,其中的任何子元素(如果有的话)都被剥夺了其子代状态,并且所有内容都被视为查询元素的文本

目前,我唯一的解决方案是:

a) 有一个检查每个结果的
foreach
循环,如:

$result_text = ($result -> strong) ? $result - strong : $result;

b) 在将HTML字符串导入任何预构建类(如simplexml或DOMDocument)之前,请使用正则表达式从HTML字符串中去除任何
标记。

在使用正则表达式解析HTML之前,请阅读的第一个答案,如果只是出于娱乐的目的。XPath就是答案,获取td的文本,而不是继续解析它。因此,您只需搜索类似于
//td
的内容,并完整地获取结果(而不是继续构建树,这样您就有了表示strong或其他内容的叶子。

难道您不能使用它来删除额外的标记吗

$table = simplexml_load_string(
    '<table>
        <tr><td>Thing 1</td><td>Thing 2</td></tr>
        <tr><td>Thing 3</td><td>Thing 4</td></tr>
        <tr><td><strong>Thing 5</strong></td><td><strong>Thing 6</strong></td></tr>
    </table>'
);

foreach ($table->xpath('//td') as $td)
{
    $content = strip_tags($td->asXML());
    echo $content, "\n";
}
$table=simplexml\u load\u字符串(
'
事情1事情2
事情3事情4
事情5事情6
'
);
foreach($table->xpath('//td')作为$td)
{
$content=strip_标记($td->asXML());
echo$content,“\n”;
}

如果您使用的是DOMDocument,一旦您选择了一个DOMNode,属性
textContent
应该只包含它的文本部分以及它的所有子项……这正是您所要求的

$table = '<table>
        <tr><td>Thing 1</td><td>Thing 2</td></tr>
        <tr><td>Thing 3</td><td>Thing 4</td></tr>
        <tr><td><strong>Thing 5</strong></td><td><strong>Thing 6</strong></td></tr>
    </table>';

$dom = new DOMDocument;
$dom->loadHTML($table);
$xpath = new DOMXPath($dom);

$els = $xpath->query('//td');
echo $els->item(4)->textContent; //Thing 5
$table='1!'
事情1事情2
事情3事情4
事情5事情6
';
$dom=新的DOMDocument;
$dom->loadHTML($table);
$xpath=newdomxpath($dom);
$els=$xpath->query('//td');
echo$els->item(4)->textContent;//事物5

或者,根据节点的类型,您也可以检查
nodeValue
。我记不起确切的区别,但这正是您想要的。

我不确定这是否是最佳解决方案,但我接受它的依据不是
strip\u标签的建议(这很聪明),而是asXML()建议,在处理将内容移动到数组之前,我没有想到要使用它。非常好。
$table = '<table>
        <tr><td>Thing 1</td><td>Thing 2</td></tr>
        <tr><td>Thing 3</td><td>Thing 4</td></tr>
        <tr><td><strong>Thing 5</strong></td><td><strong>Thing 6</strong></td></tr>
    </table>';

$dom = new DOMDocument;
$dom->loadHTML($table);
$xpath = new DOMXPath($dom);

$els = $xpath->query('//td');
echo $els->item(4)->textContent; //Thing 5