views:

52

answers:

3

Hi,

PHP:: How can be taken charset value of webpage with simple html dom parser (utf-8, windows-255, etc..)?

remark: its have to be done with html dom parser http://simplehtmldom.sourceforge.net

Example1 webpage charset input:

<meta content="text/html; charset=utf-8" http-equiv="Content-Type">

result:utf-8



Example2 webpage charset input:

<meta content="text/html; charset=windows-255" http-equiv="Content-Type">

result:windows-255

Edit:

I try this (but its not works):

$html = file_get_html('http://www.google.com/');
$el=$html->find('meta[content]',0);
echo $el->charset; 

What should be change? (I know that $el->charset not working)

Thanks

+1  A: 

You'll have to match the string using a regular expression (I hope you have PCRE...).

$el=$html->find('meta[http-equiv=Content-Type]',0)
$fullvalue = $el->content;
preg_match('/charset=(.+)/', $fullvalue, $matches);
echo $matches[1];

Not very robust, but should work.

MvanGeest
Thanks! I fix a bit and its works see my answer fix.$html = file_get_html('http://www.google.com/');$el=$html->find('meta[content]',0);$fullvalue = $el->content;preg_match('/charset=(.+)/', $fullvalue, $matches);echo substr($matches[0], strlen("charset="));
Yosef
**Don't do that**, I made a mistake. It should be `$matches[1]`. That makes it a lot faster and more reliable.
MvanGeest
+1  A: 
$dd = new DOMDocument;
$dd->loadHTML($data);
foreach ($dd->getElementsByTagName("meta") as $m) {
    if (strtolower($m->getAttribute("http-equiv")) == "content-type") {
        $v = $m->getAttribute("content");
        if (preg_match("#.+?/.+?;\\s?charset\\s?=\\s?(.+)#i", $v, $m))
            echo $m[1];
    }
}

Note that the DOM extension implicitly converts all the data to UTF-8.

Artefacto
Now that's a bit more robust than what I wrote... :)
MvanGeest
Thanks for this option, because its very important to have utf-8 data.
Yosef
@Mva yeah, Content-Type is sometimes written "Content-type". At least in the http headers, case doesn't matter.
Artefacto
DomDocument not convert proper text always to utf-8. I still working to handle this problem.
Yosef
A: 

Thanks for MvanGeest answer - I just fix a bit and its works perfect.

$html = file_get_html('http://www.google.com/');
$el=$html->find('meta[content]',0);
$fullvalue = $el->content;
preg_match('/charset=(.+)/', $fullvalue, $matches);
echo substr($matches[0], strlen("charset="));
Yosef
**Don't do that** - see the correction of my answer.
MvanGeest
Your fix not working
Yosef
Weird... it's working for me. You don't need the `substr` though... just `$matches[1]`. I tested it using Google.
MvanGeest