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

Статус
В этой теме нельзя размещать новые ответы.

phillip

Полезный
Регистрация
4 Сен 2007
Сообщения
411
Реакции
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 с новым текстом. Выручите, пожалуйста
 
Если не подвергать изменению всю структуру фрагмента, то как минимум ошибка кроется в сравнении слова из текста с ключевым словом.
Заменить строку:
PHP:
if ($word[0] == $textword[0]) { //Если слово ключевика
на строку
PHP:
if ($word == $textword) { //Если слово ключевика
 
ну это да, но это мне не поможет :confused: мне кажется надо что-то менять если не кардинально, то значительно. Подскажите плиз как делать(((
А! и если у кого-то есть готовая функция как просто ключевик из файла вставить в случайное место текста- скиньте тоже, сгодится мне. Премного благодарен :)
 
PHP:
$text= 'Ауди представила свое новое авто на автосалоне в Париже.';
$keys = file("keys.txt");
$key= array_rand($keys); // Получили случаный ключ массива. Следовательно, $keys[$key]- случайная строка из файла
$words= explode(" ",$keys[$key]); //Разбили строку из файла на слова
$textwords= explode(" ",$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);
я тут кое-чего упростил, паралельно с исправлением логики.
вынос оригинально слова в случае несовпадения ни с одним из ключевиков надо было вынести во внешний цикл(во внетреннем, слово "дублировалось")
 
Вот еще один вариант. Здесь слова могут быть разграничены не только пробелом, но и любым не буквенно-цифровым символом. Если такой вариант устроит, то надо будет еще обезопасить в поисковых фразах следующие символы:

Код:
\ ^ . $ | ( ) [ ] * + ? { } ,

PHP:
<?
$text= 'Ауди представила свое новое авто на автосалоне в Париже.';
$keys = file("keys.txt");
$key = array_rand($keys); // Получили случаный ключ массива. Следовательно, $keys[$key]- случайная строка из файла
$patterns = preg_split('/ /', $keys[$key], -1, PREG_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";
?>
 
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;

?>
 
Спасибо большое всем. попробовал вариант от BSunV, так как его код более закоментирован и мне понятен, чтоб я сам быстрее потом разбирался и усовершенствовал. Вариант работает "на ура". :)

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

Можно прочитать список файлов в массив и выбрать случайный элемент:

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);
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху