tags:

views:

151

answers:

4

I have an html (sample.html) like this:

<html>
<head>
</head>
<body>
<div id="content">
<!--content-->

<p>some content</p>

<!--content-->
</div>
</body>
</html>

How do i get the content part that is between the 2 html comment '<!--content-->' using php? I want to get that, do some processing and place it back, so i have to get and put! Is it possible?

+1  A: 

esafwan - you could use a regex expression to extract the content between the div (of a certain id).

I've done this for image tags before, so the same rules apply. i'll look out the code and update the message in a bit.

[update] try this:

<?php
    function get_tag( $attr, $value, $xml ) {

        $attr = preg_quote($attr);
        $value = preg_quote($value);

        $tag_regex = '/<div[^>]*'.$attr.'="'.$value.'">(.*?)<\\/div>/si';

        preg_match($tag_regex,
        $xml,
        $matches);
        return $matches[1];
    }

    $yourentirehtml = file_get_contents("test.html");
    $extract = get_tag('id', 'content', $yourentirehtml);
    echo $extract;
?>

or more simply:

preg_match("/<div[^>]*id=\"content\">(.*?)<\\/div>/si", $text, $match);
$content = $match[1]; 

jim

jim
so where is the `id` attribute in `<!--content-->`?
Gordon
gordon - the section that's pulled out is the content that is contained within the content (id) div. along the same lines really as the jQuery $('#content').html() function
jim
but how do i actually load the html to $yourentirehtml?
esafwan
jim
@jim The OP asked for the content between the comment nodes. While pragmatically your solution is feasible, it it is technically not what was asked.
Gordon
ok... gotcha now ;-)
jim
Thats not what i wanted... but that solves my problem! Thank you very much!!!
esafwan
yes, sometimes the impedence between the question and the answer CAN balance out - :-) thanks...
jim
+1  A: 

Have a look here for a code example that means you can load a HTML document into SimpleXML http://blog.charlvn.com/2009/03/html-in-php-simplexml.html

You can then treat it as a normal SimpleXML object.

EDIT: This will only work if you want the content in a tag (e.g. between <div> and </div>)

Jake
+5  A: 

If this is a simple replacement that does not involve parsing of the actual HTML document, you may use a Regular Expression or even just str_replace for this. But generally, it is not a advisable to use Regex for HTML because HTML is not regular and coming up with reliable patterns can quickly become a nightmare.

The right way to parse HTML in PHP is to use a parsing library that actually knows how to make sense of HTML documents. Your best native bet would be DOM but PHP has a number of other native XML extensions you can use and there is also a number of third party libraries like phpQuery, Zend_Dom, QueryPath and FluentDom.

If you use the search function, you will see that this topic has been covered extensively and you should have no problems finding examples that show how to solve your question.

Gordon
good points raised re reliable patterns
jim
+1, and if you're looking for a proper XPath to match the nodes, it's `(//*|//text())[preceding-sibling::comment()='content' and following-sibling::comment()='content']`
Wrikken
Thanx... All the links helped me a lot, though it didn't answer me straight.. Links are worth reading and helped me gain more depth in php!
esafwan
+2  A: 
<?php

    $content=file_get_contents("sample.html");
    $comment=explode("<!--content-->",$content);
    $comment=explode("<!--content-->",$comment[1]);
    var_dump(strip_tags($comment[0]));
?>

check this ,it will work for you

Ankur Mukherjee