代碼:
$html = preg_replace_callback("/(?[\x{4e00}-\x{9fa5}]+)/u",array("self","wyc_chinese"),$html);...省略...public function wyc_chinese($matches){ return $matches['chinese'].'(Chinese)';}
問題:
$html為要提取的網頁資料
如果$html是utf8編碼的,則以上代碼能正常執行(即能正常提取中文),但如果是其他編碼的,則沒法正常執行(無法匹配到漢字)
使用iconv轉換$html的編碼格式,也無法正常提取中文。
回複內容:
代碼:
$html = preg_replace_callback("/(?[\x{4e00}-\x{9fa5}]+)/u",array("self","wyc_chinese"),$html);...省略...public function wyc_chinese($matches){ return $matches['chinese'].'(Chinese)';}
問題:
$html為要提取的網頁資料
如果$html是utf8編碼的,則以上代碼能正常執行(即能正常提取中文),但如果是其他編碼的,則沒法正常執行(無法匹配到漢字)
使用iconv轉換$html的編碼格式,也無法正常提取中文。
以來識別編碼是錯誤的.有些網頁沒有寫meta,對於現代瀏覽器也會正常顯示的(IE6有問題,IE7,IE8沒測~)
應該根據HTTP回應標頭Content-Type: text/html; charset=UTF-8來判斷.如果沒有返回charset,就根據內容來自行判斷了..
為了方便,最好將html轉換為UTF-8來進行正則匹配.
[ '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);
你這問題的核心是網頁編碼轉換成UTF-8
你說源編碼是"根據meta標籤的charset欄位來判斷的"
我也是這樣子做的, 不過我成功.
你沒給出詳盡代碼,我不知道是你的代碼哪裡出錯了,還是純粹是我的人品比你好.
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 '';print_r($m);exit;
使用以上代碼的iconv
不使用以上代碼的iconv