Замена ключевиками из файла. Запутался в циклах

Тема в разделе "PHP", создана пользователем phillip, 3 апр 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. phillip

    phillip

    Регистр.:
    4 сен 2007
    Сообщения:
    413
    Симпатии:
    15
    Помогите сделать. для доргенчика. Суть в том что скрипт берет случайный ключевик из файла. например
    Дешевое авто купить.
    Разбивает ключевик на массив, значение массива- слово ключевика. И должен в тексте искать совпадения с этим словом. Если нашел- меняет. Например:
    Текст- Ауди представила свое новое авто на автосалоне в Париже.
    Ключевик- Дешевое авто купить.
    Реузльтат- Ауди представила свое новое Дешевое авто купить на автосалоне в Париже.
    Пробую делать так- не выходит нифига. Подскажите как сделать

    Код:
    $text= 'Ауди представила свое новое авто на автосалоне в Париже.';
    $keys = file("keys.txt");
    $key= array_rand($keys); // Получили случаный ключ массива. Следовательно, $keys[$key]- случайная строка из файла
    $words= preg_split('/ /', $keys[$key], -1, PREG_SPLIT_OFFSET_CAPTURE); //Разбили строку из файла на слова
    $textwords= preg_split('/ /', $text, -1, PREG_SPLIT_OFFSET_CAPTURE); //Разбили исходный текст на слова
    $newtext = array();
    $num = 0;
    foreach ($textwords as $textword) { //Для каждого слова исходного текста выполняем цикл
    		foreach ($words as $word) { //Для каждого слова из ключевика делаем действия....
    		
    		if ($word[0] == $textword[0]) { //Если слово ключевика совпадает с словом в тексте...
    		$newtext[$num] = $keys[$key];  //Элементом нового массива записываем ключевик (строка из файла)
    		echo $keys[$key];
    		}
    		else {  //Если не совпадает, то...
    		$newtext[$num] = $word[0]; 
    		echo '<h3>'.$word[0].'</h3>';
    		}
    		$num++;
    		
    	}
    }
    echo implode(",", $newtext);
    Я не могу понять как сделать мне чтобы все было нормульно. Чтобы сохранялись знаки препинания. Чтоб в итоге на выходе у меня был string с новым текстом. Выручите, пожалуйста
     
  2. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    Если не подвергать изменению всю структуру фрагмента, то как минимум ошибка кроется в сравнении слова из текста с ключевым словом.
    Заменить строку:
    PHP:
    if ($word[0] == $textword[0]) { //Если слово ключевика 
    на строку
    PHP:
    if ($word == $textword) { //Если слово ключевика 
     
  3. phillip

    phillip

    Регистр.:
    4 сен 2007
    Сообщения:
    413
    Симпатии:
    15
    ну это да, но это мне не поможет :confused: мне кажется надо что-то менять если не кардинально, то значительно. Подскажите плиз как делать(((
    А! и если у кого-то есть готовая функция как просто ключевик из файла вставить в случайное место текста- скиньте тоже, сгодится мне. Премного благодарен :)
     
  4. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    PHP:
    $text'Ауди представила свое новое авто на автосалоне в Париже.';
    $keys file("keys.txt");
    $keyarray_rand($keys); // Получили случаный ключ массива. Следовательно, $keys[$key]- случайная строка из файла
    $wordsexplode(" ",$keys[$key]); //Разбили строку из файла на слова
    $textwordsexplode(" ",$text); //Разбили исходный текст на слова
    $newtext = array();
    $num 0;
    foreach (
    $textwords as $textword)
        {
        
    $flag=TRUE;
        foreach (
    $words as $word
            {
            if (
    $word == $textword)
                {
                
    $newtext[$num] = $keys[$key];
                
    $flag=FALSE;
                break;
                }
            }
        if(
    $flag==TRUE)
            
    $newtext[$num] = $textword
        
    $num++;
        }
    echo 
    implode(" "$newtext);
    я тут кое-чего упростил, паралельно с исправлением логики.
    вынос оригинально слова в случае несовпадения ни с одним из ключевиков надо было вынести во внешний цикл(во внетреннем, слово "дублировалось")
     
    phillip нравится это.
  5. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    Вот еще один вариант. Здесь слова могут быть разграничены не только пробелом, но и любым не буквенно-цифровым символом. Если такой вариант устроит, то надо будет еще обезопасить в поисковых фразах следующие символы:

    Код:
    \ ^ . $ | ( ) [ ] * + ? { } ,
    PHP:
    <?
    $text'Ауди представила свое новое авто на автосалоне в Париже.';
    $keys file("keys.txt");
    $key array_rand($keys); // Получили случаный ключ массива. Следовательно, $keys[$key]- случайная строка из файла
    $patterns preg_split('/ /'$keys[$key], -1PREG_SPLIT_OFFSET_CAPTURE); //Разбили строку из файла на слова
    $replacements = array();
    $i 0;
    while(isset(
    $patterns[$i])) {
      
    $patterns[$i] = '/(.*[^a-zA-Z\200-\377])' $patterns[$i][0] . '([^a-zA-Z\200-\377].*|$)/m';
      
    $replacements[] = '\1===' $i '===\2';
      echo 
    "pat[$i]={$patterns[$i]}<br>";
      echo 
    "rept[$i]={$replacements[$i]}<br>";
      
    $i++;
    }

    $result preg_replace($patterns$replacements$text);
    echo 
    "result1=$result<br>";
    $result preg_replace('/===[0-9]+===/m'$keys[$key], $result);
    echo 
    "result2=$result";
    ?>
     
    phillip нравится это.
  6. BSunV

    BSunV

    Регистр.:
    8 окт 2008
    Сообщения:
    186
    Симпатии:
    45
    HTML:
    <?php
    
    $text= 'Ауди представила свое новое авто на автосалоне в Париже.';
    $keys = file("keys.txt");
    echo "$text <br>";                         //уберешь потом, для наглядности
    $key= array_rand($keys);
    $string = $keys[$key];                   //это наш ключевик
    echo "$string <br>";                       //уберешь потом, для наглядности
    $words = split(" ",$string);              //разбиваем ключевик на слова
    $textwords=split(" ", $text);           //разбиваем строку на слова
    $newtext = "";                             //сюда сохраняем результат
    $check=false;
    
    for ($i=0; $i<count($textwords); $i++)              //Берем одно слово из строки
    {
    	for($j=0; $j<count($words); $j++)         //Сравниваем каждое слово ключевика со словом из строки
    	{
    		if (trim($textwords[$i])==trim($words[$j])) //Если совпадает
    		{
    		    $newtext=$newtext." ".$string;     //вставляем в новую строку ключевик полностью
    		    $check=true;                             //показываем что в новую строку вставили ключевик
    		    break;                                      //прекращаем итерации
    		}
    
    
    	}
    
    		if ($check == false)               //если не вставили ключевик,
    		{
    			$newtext= $newtext." ".$textwords[$i];    //значит вставим слово из строки
    		}
    		$check = false;                       // возвратим первоначальное значение
    
    }
    
    echo $newtext;
    
    ?>
     
    phillip нравится это.
  7. phillip

    phillip

    Регистр.:
    4 сен 2007
    Сообщения:
    413
    Симпатии:
    15
    Спасибо большое всем. попробовал вариант от BSunV, так как его код более закоментирован и мне понятен, чтоб я сам быстрее потом разбирался и усовершенствовал. Вариант работает "на ура". :)

    А если мне надо выбрать случайную картинку из папки, и добавить ее в наш $newtext, как лучше сделать, подскажите плиз. Топик отдельный не буду создавать, зачем плодить похожие топики
     
  8. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    Можно прочитать список файлов в массив и выбрать случайный элемент:

    PHP:
    $papka "/tmp/images/"// путь к каталогу с картинками, слэш в конце важен.
    $aimages = array(); // это будет массив с именами файлов картинок
    if ( is_readable ($papka) ){ // если каталог читаемый
        
    $handle opendir ($papka); // открываем его
        
    while ( $filename readdir ($handle)){
            if (
    $filename != "." and $filename != ".."){
               if ( 
    is_file ($papka.$filename)){ // берем только файлы, каталоги пропускаем
                  
    $aimages[] = $filename;
              }
           }
        }
        
    clearstatcache (); // очищаем кэш
        
    closedir ($handle); // закрываем каталог
    }
    // в массиве - имена файлов без пути, выбираем произвольное имя
    // и добавляем перед именем путь, чтобы получить полный путь к файлу
    $image_filename $papka array_rand(aimages);
     
    phillip нравится это.
Статус темы:
Закрыта.