Heim > Backend-Entwicklung > PHP-Tutorial > PHP:preg_replace_callback匹配中文的问题

PHP:preg_replace_callback匹配中文的问题

WBOY
Freigeben: 2016-06-06 20:46:37
Original
1286 Leute haben es durchsucht

代码:

<code>$html = preg_replace_callback("/(?<chinese>[\x{4e00}-\x{9fa5}]+)/u",array("self","wyc_chinese"),$html);
...
省略
...
public function wyc_chinese($matches)
{       
    return $matches['chinese'].'(Chinese)';
}
</chinese></code>
Nach dem Login kopieren
Nach dem Login kopieren

问题:
$html为要提取的网页数据
如果$html是utf8编码的,则以上代码能正常执行(即能正常提取中文),但如果是其他编码的,则没法正常执行(无法匹配到汉字)
使用iconv转换$html的编码格式,也无法正常提取中文。

回复内容:

代码:

<code>$html = preg_replace_callback("/(?<chinese>[\x{4e00}-\x{9fa5}]+)/u",array("self","wyc_chinese"),$html);
...
省略
...
public function wyc_chinese($matches)
{       
    return $matches['chinese'].'(Chinese)';
}
</chinese></code>
Nach dem Login kopieren
Nach dem Login kopieren

问题:
$html为要提取的网页数据
如果$html是utf8编码的,则以上代码能正常执行(即能正常提取中文),但如果是其他编码的,则没法正常执行(无法匹配到汉字)
使用iconv转换$html的编码格式,也无法正常提取中文。

<meta charset="utf-8">来识别编码是错误的.有些网页没有写meta,对于现代浏览器也会正常显示的(IE6有问题,IE7,IE8没测~)
应该根据HTTP响应头Content-Type: text/html; charset=UTF-8来判断.如果没有返回charset,就根据内容来自行判断了..
为了方便,最好将html转换为UTF-8来进行正则匹配.

<code class="lang-php"><?php //编辑器的编码格式为UTF-8(无BOM)

$remote_url = 'http://segmentfault.com/q/1010000000450422';

$context = stream_context_create([
    'http' => [
        'method' => 'GET',
    ],
]);
$html = file_get_contents($remote_url, false, $context);

$html_encoding = mb_detect_encoding($html, ['UTF-8', 'CP936', 'ASCII']);

//转换为UTF-8
$target_encoding = 'UTF-8';
$html = $target_encoding === $html_encoding ? $html : mb_convert_encoding($html, $target_encoding, $html_encoding);

//匹配
$count = preg_match_all('#[\x{4e00}-\x{9fa5}]+#u', $html, $matches);

var_dump($matches);
</code>
Nach dem Login kopieren

你这问题的核心是网页编码转换成UTF-8

你说源编码是"根据meta标签的charset字段来判断的"

我也是这样子做的, 不过我成功.

你没给出详尽代码,我不知道是你的代码哪里出错了,还是纯粹是我的人品比你好.

<code>require_once(__DIR__.'/wp-config.php');
$resp = wp_remote_get('http://51nb.com/');
$html = $resp['body'];
preg_match('@charset=([-a-z0-9_]+)@i',$html,$charset);
$html = iconv(strtoupper($charset[1]), "UTF-8", $html);
preg_match_all("@\p{Han}+@u",$html,$m);     
echo '<meta charset="UTF-8">';
print_r($m);
exit;
</code>
Nach dem Login kopieren

使用以上代码的iconv

PHP:preg_replace_callback匹配中文的问题

不使用以上代码的iconv

PHP:preg_replace_callback匹配中文的问题

Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage