Php 从html提取文本时出现奇怪字符

Php 从html提取文本时出现奇怪字符,php,html-parsing,Php,Html Parsing,我正在从作为字符串传递的html中提取一些文本。提取的文本格式很奇怪。它应该是阿拉伯语,但提取时显示奇怪的字符。我对代码进行了注释,使其易于理解。总的来说,代码会做些什么来找出传递的html的字符集,例如(utf,windows-1256),然后以适当的方式加载文档。使用html节点解析在循环中查找所需的html元素,并提取每个元素所需的文本 问题是if语句中的两个语句都有效 $html = @iconv('windows-1256', 'windows-1256', $html); @$do

我正在从作为字符串传递的html中提取一些文本。提取的文本格式很奇怪。它应该是阿拉伯语,但提取时显示奇怪的字符。我对代码进行了注释,使其易于理解。总的来说,代码会做些什么来找出传递的html的字符集,例如(utf,windows-1256),然后以适当的方式加载文档。使用html节点解析在循环中查找所需的html元素,并提取每个元素所需的文本

问题是if语句中的两个语句都有效

$html =  @iconv('windows-1256', 'windows-1256', $html);
@$doc->loadHTMl($this->metaUtf8. $html);
在被注释掉之后的以下语句显示了乱七八糟的文本,它不应该是这样,并且应该在没有上述两个语句的情况下工作。那么原因是什么呢

//@$doc->loadHTMl($this->metaWindows1256. $html);
守则:

    //strings declared that will appended to html when loading the doc
    public $metaWindows1256 = '<meta http-equiv="Content-Type" content="text/html; charset=windows-1256"/>' ;
    public $metaUtf8 = '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>' ;

    //extract characterset of html passed in variable $html
    preg_match( '@<meta\s+http-equiv="Content-Type"\s+content="([\w/]+)(;\s+charset=([^\s"]+))?@i', $html, $matches );
    if ( isset( $matches[3] ) )
    {
        $charset = $matches[3];
    }

    $doc = new DOMDocument();
    if(!($charset=='UTF-8') && !($charset=='utf-8'))
    {

            $html =  @iconv('windows-1256', 'windows-1256', $html);
            @$doc->loadHTMl($this->metaUtf8. $html);
        //@$doc->loadHTMl($this->metaWindows1256. $html);
    }
    else
    {
            echo 'LOADING UTF';
        @$doc->loadHTMl($this->metaUtf8. $html);
    }

    foreach($doc->getElementsByTagName($element_tagname) as $element)
    {
        if (substr_count($element->getAttribute($attribute),$value)!=0) //if the title of the div contains 'post_message'
        {
            $found_element[]= $element->getAttribute('href');
            $found_element[]= $element->nodeValue;
            $found_elements[] = $found_element;
            unset($found_element);
        }
    }`
//加载文档时将附加到html的声明字符串
公共$metaWindows1256='';
公共$metaUtf8='';
//提取在变量$html中传递的html字符集

预赛(@我发现我在代码的其他部分将html从windows1256转换为utf。现在,当我再次使用其元检查html的字符集时,它当然会说它是windows1256,尽管我已经将其转换为utf。因此,后来我再次尝试将其转换为utf,因此奇怪的字符集字符


无论如何,谢谢你

尽量避免使用@operator。它会对性能产生相当大的影响,并且在调试代码时会让你的生活比需要的困难得多。你最好使用错误报告、显示错误和日志错误PHP设置或ini设置调用来配置错误消息输出。你为什么使用
iconv
使用两种相同的编码?@Marek Sebera:奇怪的是,没有这两种编码,它就不能工作。获取那些奇怪的字符问题解决了,我的答案是below@TRiG-它让我等两个人days@Imran字体已经两天多了。