PHP在HTML节点之间获取文本

时间:2014-10-23 08:05:05

标签: javascript php html arrays regex

标题说全部。如何使用PHP在HTML节点之间获取文本?有任何想法吗? 下面是我的HTML结构。

<html>
<head>
    <title>Test Page</title>
</head>
<body>
    <div id="outer">
        <div id="first">
            <p class="this">Hello</p>
            <p class="this">Community</p>
        </div>
        <div id="second">
            <p class="that">Stack</p>
            <p class="that">Overflow</p>
        </div>
    </div>
</body>

预期输出:

HelloStackOverflowCommunity

5 个答案:

答案 0 :(得分:1)

这很简单,在这里获取PHP Simple HTML DOM Parser:http://sourceforge.net/projects/simplehtmldom/files/

然后使用以下代码:

/* include simpledom*/
include('simple_html_dom.php');

/* load html string */
$html_string = <<<HTML
<html>
<head>
    <title>Test Page</title>
</head>
<body>
    <div id="outer">
        <div id="first">
            <p class="this">Hello</p>
            <p class="this">Community</p>
        </div>
        <div id="second">
            <p class="that">Stack</p>
            <p class="that">Overflow</p>
        </div>
    </div>
</body>
</html>
HTML;

/* create simple dom object from html */
$html = str_get_html($html_string);

/* find all paragraph elements */
$paragraph = $html->find('div[id=outer] div p');

/* loop through all elements and get inner text */
foreach($paragraph as $p){
    echo $p->innertext;
}

干杯,

罗伊

答案 1 :(得分:0)

你可以尝试:

$text = strip_tags($html);

http://www.php.net/manual/en/function.strip-tags.php

这会让你走得很远。它会留下空间和返回,但这些很容易删除。

$clean = str_replace(array(' ',"\n","\r"),'',$text);

http://www.php.net/manual/en/function.str-replace.php

在你的例子中使用它给出:

TestPageHelloCommunityStackOverflow

如果你想保留一些空格,你可以尝试:

$clean = trim(implode('',explode("\n",$text)));

导致:

Test Page Hello Community Stack Overflow

可能有很多变化。

答案 2 :(得分:0)

强烈建议不要使用正则表达式来解析HTML 使用简单HTML库:http://sourceforge.net/projects/simplehtmldom/files/simplehtmldom/
包含它:include 'simple_html_dom.php';
获取所需的标签:$tags = $html->find('p');
创建数组:$a = array(); foreach ($tags as $tag) $a[] = $tag->innertext;;
创建字符串:$string = $a[0] . $a[2] . $a[3] . $a[1];

答案 3 :(得分:0)

我建议你使用PHP内置的DOMDocument而不是像simplehtmldom这样的第三方类。

在大型HTML文件上,它们非常慢(我使用过它们)。

<?php
$html ='
<html>
<head>
    <title>Test Page</title>
</head>
<body>
    <div id="outer">
        <div id="first">
            <p class="this">Hello</p>
            <p class="this">Community</p>
        </div>
        <div id="second">
            <p class="that">Stack</p>
            <p class="that">Overflow</p>
        </div>
    </div>
</body>
';

// a new dom object
$dom = new domDocument; 
$dom->preserveWhiteSpace = false;

// load the html into the object
$dom->loadHTML($html); 
// get the body tag
$body = $dom->getElementsByTagName('body')->item(0);
 // loop through all tags
foreach($body->getElementsByTagName('*') as $element ){
    // print the textValue
    print $element->firstChild->textContent;
}

输出为HelloCommunity StackOverflow

答案 4 :(得分:-1)

试试这个

function getTextBetweenTags($string, $tagname)
 {
    $pattern = "/<$tagname>(.*?)<\/$tagname>/";
    preg_match($pattern, $string, $matches);
    return $matches[1];
 }

你必须遍历$ matches数组......