2017-02-15 46 views
0

我想从HTML字符串中提取所有链接文本和hrefs,但源字符串是Unicode,并且nodeValue似乎无法应付此问题?PHP:Unicode nodeValue?

$links = array(); 
$titles = array(); 

$dom = new DOMDocument(); 
$dom->loadHTML($str); 
$hrefs = $dom->getElementsByTagName("a"); 
foreach ($hrefs as $href) { 
    $links[] = $href->getAttribute("href"); 
    $titles[] = $href->nodeValue; 
} 

我的源字符串看起来是这样的:

<p><a href='uploads/root/tr_62.pdf'>Türkiye</a></p> 

但我对$输出标题[0]是这样的:

Türkiye 

如何使的nodeValue尊重Unicode字符?

感谢您的期待!

+0

当您添加'标题( “内容类型:text/html的;字符集= UTF-8”);'到您的脚本(第一输出之前)它解决了这个问题吗? –

+0

我有一个完整的HTML页眉, <!doctype html> etc ... –

+0

'DOMDocument'和所有的XML函数默认为UTF-8,所以它们可以很好地处理Unicode。从你的输出中,你的应用程序使用某种单字节非Unicode编码或者未能声明其编码(''标签大多不相关,HTTP标头当然是真正的内容)。 ///现在将您的PHP代码分开。如果您复制并粘贴静态“车”,它是否正确打印? –

回答

1

您使用多mb_convert_encoding

$dom = new DOMDocument(); 
$html_data = mb_convert_encoding($str , 'HTML-ENTITIES', 'UTF-8'); 
$dom->loadHTML($html_data ); 
$hrefs = $dom->getElementsByTagName("a"); 
foreach ($hrefs as $href) { 
    $links[] = $href->getAttribute("href"); 
    $titles[] = $href->nodeValue; 
} 
+0

这是一个解决方法,在支持UTF-8的应用程序中绝不是必需的。它仅仅掩盖了底层的编码错误配置。 –

0

谢谢,用户Veve的评论回答我的问题。

下面这行解决了我的问题:

$str = mb_convert_encoding($str, 'html-entities', 'utf-8'); 
+0

这是丹尼尔的答案,它不能“解决”问题,它通过将所有内容转换为7位US-ASCII来隐藏它。 –

+0

不完全正确,这是与Veve评论相关的答案的副本,Daniel和我都重新发布了这个答案。我没有看到Daniels的回答,直到我提交了我的。 –

+0

够公平的。无论如何,将问题视为完全重复的想法并没有将相同的信息传播到任何地方(正如刚刚发生的那样)。无论如何,我不认为这个问题实际上是一样的。我相信你的应用可能只是不支持UTF-8。 –