Старый 23.03.2014, 19:13   #1
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию PHP Скрипт Анаграмма

Что-то было скучно в выходные, к тому же шел "Код Да Винчи", решил накропать скрипт для разгадывания анаграмм и поиска всех возможных слов из введенного текста. Идея появилась после просмотра 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
Вложения
Тип файла: zip Zaliznyak.zip (1.98 Мб, 339 просмотров)

Последний раз редактировалось Pashkela; 24.03.2014 в 23:24..
Pashkela вне форума   Ответить с цитированием
Старый 24.03.2014, 22:34   #2
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию

Обновление - добавлен английский словарь, для решения анаграмм на английском (49912 слов, UTF-8)
Возможности такие же, как и с русским текстом

PS: скрипт адаптирован для работы под Windows (проверено на Denwer), PHP>=5

Последний раз редактировалось Pashkela; 24.03.2014 в 23:26..
Pashkela вне форума   Ответить с цитированием
Ответ

Метки
анаграмма, балда, много слов из одного, english anagram solver, php

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot