Как при помощи PHP узнать язык сайта (по HTTP)

jeka!

Просто Member
Как при помощи PHP узнать язык сайта (по HTTP)

Заказчику нужна некая примочка, которая определяет язык сайта.
Принцип работы такой:
Имеется список доменов, надо приконектиться к каждому и определить его язык, ну тобишь на каком языке написан контент, и на коком соответственно языке говорит админ сайта :)

Так вот, как это можно организовать? Языков ведь может быть вагон и маленькая тележка...
Если проверять наличие Content-type , charset-xxxx; то ведь не всегда сервер выдаёт кодировку документа...
 

jeka!

Просто Member
Мне это не помогло, дело в том, что мне не надо распознавать в какой из русских кодировок написан текст на странице.
Мне надо определить на каком языке.

Хотябы так: Русский / Не русский

Для этой задачи я попробывал сделать следующее - скачал документ, вырезал из него все символы, кроме русских букв:

PHP:
$str=preg_replace("/[^\xC0-\xFF]/","",$str);
Получил список символов русского алфавита, думал сначала просто проверить наличие его, да не тут то было, скачал документ на японском языке, оказалось, что японские символы
тоже находятся в пределе \xC0-\xFF и отображаются всякими ШЩоГку ...

Тут получается тупик, хотел сравнить частоту встречи символов в тексте, но оказалось, что частота встечи символов различна, для текстов разной тематики, анализировал большие файлы > 5мб текста. Как быть то?
 

Bermuda

Новичок
Автор оригинала: jeka!
Тут получается тупик, хотел сравнить частоту встречи символов в тексте, но оказалось, что частота встечи символов различна, для текстов разной тематики, анализировал большие файлы > 5мб текста. Как быть то?
Попробуй анализировать частоту слов используя словарь.
 

jeka!

Просто Member
кое что получилось, но ещё пока хорошо не тестировал...
PHP:
/*
	Определение, является ли документ русским
	true - русский
	false - не русский
*/

$win=array(
	'для'=>68,'или'=>67,'при'=>66,'что'=>65,'как'=>64,
	'это'=>63,'все'=>62,'так'=>61,'чем'=>60,'имя'=>59,
	'его'=>58,'без'=>57,'эта'=>56,'нет'=>55,'тип'=>54,
	'где'=>53,'под'=>52,'эти'=>51,'вам'=>50,'они'=>49,
	'еще'=>48,'эту'=>47,'был'=>46,'уже'=>45,'тем'=>44,
	'над'=>43,'кто'=>42,'тех'=>41,'нее'=>40,'не'=>39,
	'на'=>38,'по'=>37,'из'=>36,'то'=>35,'вы'=>34,'от'=>33,
	'но'=>32,'до'=>31,'мы'=>30,'же'=>29,'за'=>28,'об'=>27,
	'во'=>26,'их'=>25,'со'=>24,'он'=>23,'ли'=>22,'ее'=>21,
	'бы'=>20,'те'=>19,'ни'=>18,'да'=>17,'им'=>16,'ко'=>15,
	'ей'=>14,'та'=>13,'ею'=>12,'ту'=>11,'ах'=>10,'ну'=>9,
	'в'=>8,'и'=>7,'с'=>6,'к'=>5,'а'=>4,'о'=>3,'у'=>2,'я'=>1
);
$koi=array(
	'дмс'=>68,'ймй'=>67,'ртй'=>66,'юфп'=>65,'лбл'=>64,
	'ьфп'=>63,'чуе'=>62,'фбл'=>61,'юен'=>60,'йнс'=>59,
	'езп'=>58,'веъ'=>57,'ьфб'=>56,'оеф'=>55,'фйр'=>54,
	'зде'=>53,'рпд'=>52,'ьфй'=>51,'чбн'=>50,'пой'=>49,
	'еэе'=>48,'ьфх'=>47,'вщм'=>46,'хце'=>45,'фен'=>44,
	'обд'=>43,'лфп'=>42,'феи'=>41,'оее'=>40,'ое'=>39,
	'об'=>38,'рп'=>37,'йъ'=>36,'фп'=>35,'чщ'=>34,'пф'=>33,
	'оп'=>32,'дп'=>31,'нщ'=>30,'це'=>29,'ъб'=>28,'пв'=>27,
	'чп'=>26,'йи'=>25,'уп'=>24,'по'=>23,'мй'=>22,'ее'=>21,
	'вщ'=>20,'фе'=>19,'ой'=>18,'дб'=>17,'йн'=>16,'лп'=>15,
	'ек'=>14,'фб'=>13,'еа'=>12,'фх'=>11,'би'=>10,'ох'=>9,
	'ч'=>8,'й'=>7,'у'=>6,'л'=>5,'б'=>4,'п'=>3,'х'=>2,'с'=>1
);

function lang($host,$str) {
	Global $win,$koi;
	$zone=substr($host,strrpos($host,".")+1);
	if ($zone=="ru" || $zone=="su") return true;
	$str=preg_replace("/[^\xC0-\xFF\xB8\xA8\x20]/","  ","  ".$str."  ");
	if (preg_match_all("/ ([^\x20]{1,3}) /",$str,$match)) {
		$words=array_map("strtolower",$match[1]);
		$words=array_count_values($words);
		arsort($words);
	} else {
		return false;
	}
	unset($match,$str);
	$rus=0;
	$non=0;
	$count=sizeof($words);
	while (list($word,$num)=each($words)) {
		if (isset($win[$word])) {
			$rus+=($win[$word]+$count)*$num;
		} elseif (isset($koi[$word])) {
			$rus+=($koi[$word]+$count)*$num;
		} else {
			$non+=$count*$num;
		}
	}
	if ($rus>$non) return true;
	return false;
}
 

neko

tеam neko
до строчки (хотя и она неверно будет определять)...
PHP:
if ($zone=="ru" || $zone=="su") return true;
все нормально, а дальше какая-то каша...

ты методику пропробуй словами описать, сразу станет ясно.
кстати, ты про unicode слышал?

-~{}~ 26.05.04 02:26:

я вот думаю, мб по заголовку

Content-type: .../...; charset=

хотя опять таки он не всегда возвращается
и в случае с unicode это непоможет...
 

jeka!

Просто Member
Тут принцип работы такой, я проанализировал файл текста 5мб, выбрал все слова 1,3 символа длиной.
Посчитал их, и составил массив наиболее часто встречающижся совпадений, из этого всего составил массив $win, $koi - тоже самое. Другие русские кодировки на сайтах встечаются очень редко, я на них и забил.

А дальше всё просто, убераю из документа всё кроме русского алфавита, выделяю слова длиной 1,3 символа, и сравниваю эти слова с массивами $win и $koi, если слово найдено, значет его вес * на кол-во этих слов в тексте и эта сумма прибавляется к переменной $rus, если не найдено, значет прибавляю вес этого слова * на кол-во к переменной $non.
Вес по умолчанию, = кол-ву найденных слов в документе.

Потом считаем какая переменная больше, $rus или $non, и соответственно получаем язык документа.

Пробовал японские, немецкие, украинские сайты, всё работает. Даже украинские, где большая часть русского текста, определяется как non.

-~{}~ 26.05.04 04:27:

про unicode слышал, нет примеров узнать подробнее...
 
Сверху