选择所有子项文本值

时间:2011-12-12 11:33:15

标签: php xpath html-parsing

要解析的文本

<div id="test">some<b>bold</b> or <i>italic</i> text</div>
<div id="test">and again<b> bold text</b><i>and italic text<i></div>

我想要

的结果
1 : some bold or italic text
2 : and again blod text and italic text

我尝试了什么

string(//div)
normalize-space(//div)

给出好的格式化答案,但只有一个结果。

id('test')//text()

提供所有文字但分割结果。

我尝试使用字符串连接或连接但没有运气。 我想在php中这样做。

4 个答案:

答案 0 :(得分:0)

html中没有很多样式标记,您可以尝试创建自己的函数来擦除不需要的html。类似的东西:

function htmlToText(text) {
    return text.replace(/<i>/i, '').replace(/<b>/i, '').replace(/<s>/i, '').replace(/<span>/i, '');
}

答案 1 :(得分:0)

您需要在此处使用正则表达式从HTML标记内部提取文本。如果您对正则表达式不热,此网站会让您烦恼。

http://www.regular-expressions.info/

然后使用preg_replace(http://php.net/preg_replace)使用您构建的模式提取文本。

答案 2 :(得分:0)

试试这个:

             $dom = new \DOMDocument();
             $dom->loadHTML('<!DOCTYPE HTML>
<html lang="en-US">
<head>
       <meta charset="UTF-8">
       <title></title>
</head>
<body>
       <div id="test1">some<b>bold</b> or <i>italic</i> text</div>
       <div id="test2">and again<b> bold text</b><i>and italic text</i></div>
</body>
</html>');

              $xpath = new \DOMXPath($dom);
              foreach ( $xpath->query('//div[contains(@id,"test")]') as $node ) {
                      echo $node->nodeValue , PHP_EOL;
              }

输出:

somebold or italic text
and again bold textand italic text

答案 3 :(得分:0)

假设您有此XML文档

<html>
  <div id="test">some<b>bold</b> or <i>italic</i> text</div>
  <div id="test">and again<b> bold text</b><i>and italic text</i></div>
</html>

然后使用

string(/*/div[1])

评估此XPath表达式的结果是:

somebold or italic text

<强>类似地

string(/*/div[2])

评估时产生:

and again bold textand italic text

如果您想要用空格分隔每个文本节点,使用单个XPath 1.0表达式无法实现(可以使用单个XPath 2.0表达式完成)。相反,您需要评估:

 /*/div[1]//text()

这选择(在列表或数组结构中,取决于您的编程语言)/*/div[1]的所有文本节点后代:

“some”“bold”“或”“italic”“text”。

类似地:

 /*/div[2]//text()

选择(在列表或数组结构中,取决于您的编程语言)/*/div[2]的所有文本节点后代:

现在,使用您的编程语言,您必须将它们与中间空间连接起来以产生最终的想要结果