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