2010-01-17 72 views
1

我有一个外部HTML源,我想刮,并转换成本地XML文件或添加到MySQL数据库。将HTML导入DOMDocument或SimpleXML时删除内联元素?

外部源主要是标准化和(有点)的语义,让所有我需要做的就是使用XPATH让所有td内容或全部li内容等的问题是,偶尔这些项目使用<strong><b><i>标签来设计我需要的元素。

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

的问题是,我试图抓住实际内容则认为此内联元素的一个孩子,让PHP扩展像simplexmlDOMDocumentDOMNode这样对待他们。例如:

<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> 

会导致:

[table] => 
    [tr] => 
     [td] => Thing 1 
     [td] => Thing 2 
    [tr] => 
     [td] => Thing 3 
     [td] => Thing 4 
    [tr] => 
     [td] => 
      [strong] => Thing 5 
     [td] => 
      [strong] => Thing 6 

显然,上面是不太什么simplexml的回报,但上面反映的普遍问题。

所以有一种方法,使用DOMDocument已经内置的参数或使用额外的复杂XPath查询来获取td元素的内容与任何孩子(如果有的话)剥夺了他们的后代状态和所有内容视为查询元素的文本?

现在,唯一的解决办法我是要么:

一个)具有foreach循环,检查每一个结果,如:使用正则表达式剥去任何<strong>标记出

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

b)中在将其导入到任何预构建的类(如simplexml或DOMDocument)之前,先将HTML字符串转换为HTML字符串。

回答

1

你不能只用strip_tags()去除额外的东西标记?

$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"; 
} 
+0

我不确定这是否是最好的解决方案,但我接受它并不是基于'strip_tags'建议(这很聪明),而是基于asXML()建议,而这并没有发生给我使用之前处理移动内容到一个数组。非常好。 – Anthony 2010-01-17 08:44:56

1

请在阅读正则表达式解析html之前阅读this的第一个答案,如果只是为了娱乐的缘故。 XPath是答案,得到td的文本而不是继续解析它。所以你只需要搜索//td之类的东西,然后把结果完全取出(而不是继续树木建筑,这样你就可以在树叶上说出强烈的或者任何其他的东西)

0

如果你使用DOM文档,一旦你选择的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 

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