Pashkela |
23.03.2014 20:13 |
PHP Скрипт Анаграмма
Вложений: 1
Что-то было скучно в выходные, к тому же шел "Код Да Винчи", решил накропать скрипт для разгадывания анаграмм и поиска всех возможных слов из введенного текста. Идея появилась после просмотра http://4maf.ru/anagram.php
Особенности:
- Четыре режима работы:
- 1. Поиск всех возможных слов - ($get_all_words=1)
- 2. Поиск анаграммы слова (того слова, что можно составить из введенного текста + только из этих же букв + равного по длине) - ($get_all_words=0)
- 3. Поиск возможных словосочетаний, максимум два слова, например:
- бблей рыаан выдаст 1:баран+белый 2:белый+баран,
- ЫЛБН ГЙЕЕС выдаст 1:белый+снег 2:снег+белый,
- Фидель Жулазес выдаст 1:железа+сульфид 2:сульфид+железа - ($get_all_words=1 и $slov=1)
- 4. Если вставить тигр+урна в режиме анаграммы($get_all_words=0), то выдаст гарнитур - т.е. родит одно слово из двух(или трех, четырех и т.д.)
- Тыл ее чести - я выдаст тысячелетие
- Контора и зло выдаст колонизатор
- Возможность задавать ограничения на длину выводимых слов (по умолчанию показываются слова от 2-х символов) - ($word_lenght=2)
- В комплекте 4 словаря (можно переключать):
- Словарь Про-Линг (125723 слов, переконвертирован в UTF-8)
- Словарь русской литературы (162232 слов, переконвертирован в UTF-8)
- Словарь А. А. Зализняка (93392 слов, переконвертирован в UTF-8)
- Англо-русский словарь (49912 слов, переконвертирован в UTF-8) - для решения английских анограмм, возможности такие же, как и с русским языком, есть перевод
русские словари взяты с http://speakrus.ru/dict/index.htm - можете подключить любой свой, только придется переконвертировать в UTF-8
- Вся работа построена на файлах (из-за чего, возможно, не самый быстрый вариант работы)
- Все под UTF-8 (но проблем не должно быть, по идее)
- Нет ограничений на длину вводимого текста
- Автоматическое удаление всех спецсимволов из текста (пробелы, цифры и etc)
- Все настройки задаются в файле
- Не сложно подключать другие языки
в архиве сам скрипт и словари(UTF-8)
PHP код:
<pre>
<head><meta charset="UTF-8"><script>var a,b;function foo(c){if(a!=c){b=0;a=c};b ^= 1;c.checked=b};</script></head>
<?php
# General settings ###############################################################################################################
#
$get_all_words=1;// получить все слова из введенного текста - 1, получить равное по длине слово (режим "анаграмма") - 0 #
$word_lenght=2;// Показать все слова, чья длина больше или равна данной переменной #
$slov=1;//Показать возможные словосочетания - 1, нет - 0, максимум 2 слова #
#
##################################################################################################################################
set_time_limit(0);
# Для переконвертации словарей в *никс-ах в UTF-8:
# $ sudo apt-get install recode
# $ recode CP1251..UTF8 file.txt
function f($a){global $get_all_words,$slov;echo '<form method="post">
<input type="radio" onclick="foo(this);" name="an" value="0" size="17"'. ($get_all_words==0?'checked="checked"':'').'>Анаграмма<input type="radio" onclick="foo(this);" name="vse" value="1" size="17"'.($get_all_words==1?'checked="checked"':'').'>Все слова<input type="radio" onclick="foo(this);" name="popar" value="1" size="17"'.($slov?'checked="checked"':'').'>Возможные сочетания (макс. 2 слова)
<p>Введите текст:</p><input name="str" value="'.$a.'"><input type="submit" name="submit" value="Go"><strong> Выберите словарь: </strong><select name="menu" size="1">
<option selected="selected" value="pro_ling_UTF8.txt">Словарь Про-Линг (125723 слов, переконвертирован в UTF-8)</option>
<option value="rus_lit_UTF8.txt">Словарь русской литературы (162232 слов, переконвертирован в UTF-8)</option>
<option value="zaliznyak_UTF8.txt">Словарь А. А. Зализняка (93392 слов, переконвертирован в UTF-8)</option>
<option value="ruen_UTF8.txt">Англо-русский словарь (49912 слов), для анаграмм на английском языке</option></select>
</form>';}
function mbStringToArray($str=''){
return preg_split('/(?!^)(?=.)/u', $str);
}
if(isset($_POST["submit"])&&!empty($_POST["str"])){
if(isset($_POST["vse"]))
$get_all_words=1;
if(isset($_POST["popar"])){
$slov=1;$get_all_words=1;
}else $slov=0;
if(isset($_POST["an"]))
$get_all_words=0;
$voc=trim($_POST["menu"]);
$result = file($voc);
$string = array_unique($result);
unset($result);
$string = array_values(array_filter($string));
$str1=array();$schet=0;$result=array();
$str = mb_strtolower(trim($_POST["str"]),'utf-8');
if($voc!=="ruen_UTF8.txt"){
$str = trim(strip_tags(@ereg_replace("[^абвгдеёжзийклмнопрстуфхцчшщъыьэюя]","",$str)));
} else $str = trim(strip_tags(@ereg_replace("[^abcdefghijklmnopqrstuvwxyz]","",$str)));
$str1=mbStringToArray($str);
$limit = count($string);
$limit1 = count($str1);
f($_POST["str"]);
if($get_all_words==0){
$word_lenght=$limit1;
echo "\nПолучаем анаграмму для текста:\n\n----------------------------------\n\n".trim(htmlspecialchars($_POST["str"]))."\n\n----------------------------------\n\n";
} else echo "\nПолучаем все возможные слова из словаря '$voc' для текста:\n\n----------------------------------\n\n".trim(htmlspecialchars($_POST["str"]))."\n\n----------------------------------\n\n";
echo '<textarea name="str" cols=90 rows=10>';
$per=array();
for($i=0; $i<$limit; $i++) {
$flag=0;
$string[$i]=trim($string[$i]);
if($voc==="rus_lit_UTF8.txt"){
$string[$i]=preg_replace('/\d/','',$string[$i]);
$string[$i]=str_replace(' ','',$string[$i]);
}
if($voc==="ruen_UTF8.txt"){
$ru="";$eng="";
if(!empty($string[$i])){
list($ru,$eng)=explode("--",$string[$i]);
$eng=@ereg_replace("[^abcdefghijklmnopqrstuvwxyz]","",$eng);
$string[$i]=$eng;$per[$i]=rtrim($ru);
}
}
if((strlen($str)>=strlen($string[$i]))&&!empty($string[$i])){
$search=mbStringToArray($string[$i]);
$limit2 = count($search);
for($j=0; $j<$limit1; $j++){
if(in_array($str1[$j],$search)){
$temp=$str1;
for($z=0; $z<$limit2; $z++){
if(in_array($search[$z],$temp) && !empty($temp)){
unset($temp[array_search($search[$z],$temp)]);
$flag=1;
} else{$flag=0;break;}
}
}
}
if($flag==1&&$limit2>=$word_lenght){
$result[]=$string[$i];$schet++;
if($voc!=="ruen_UTF8.txt"){
$tk="";
} else $tk="[".$per[$i]."] ";
if(strlen($string[$i])==strlen($str)){
echo $schet.":$tk".$string[$i] . " <===\n";
} else echo $schet.":$tk".$string[$i] . "\n";
}
}
}
echo "</textarea>\n\n";
}else f('');
unset($string);
unset($temp);
unset($search);
unset($per);
if($slov==1&&!empty($result)){
echo "\nВозможные словосочетания:\n";
echo '<textarea name="str" cols=90 rows=10>';
$limit=count($result);
$schet=1;
for($i=0; $i<$limit; $i++){
$temp1=$result;
$kor=$result[$i];
if(!empty($temp1))
unset($temp1[array_search($kor,$temp1)]);
foreach($temp1 as $v=>$k){
if(strlen($kor.$k)==strlen($str)){
$search=mbStringToArray($kor.$k);
$limit2 = count($search);
$temp1=$str1;
for($z=0; $z<$limit2; $z++){
if(in_array($search[$z],$temp1) && !empty($temp1)){
unset($temp1[array_search($search[$z],$temp1)]);
$flag=1;
}else{$flag=0;break;}
}
if($flag==1){
echo $schet.":".$kor."+".$k . "\n";
$schet++;
}
}
}
}
echo "</textarea>\n\n";
}
unset($search);
unset($temp1);
unset($str1);
unset($result);
?>
PS: проверить работу можно с помощью вот такого теста:
http://ankt.ru/test.php?id_test=73
но не забывайте менять словари (иногда одна и та же анограмма выдает разные варианты)
поставьте галочку напротив "Анаграмма" и вперед
PSS: для тестов на английском: http://otvet.mail.ru/question/94130248
|