Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Пипл, ай ниид хелп. Вери-вери ниид.
Форумы портала PHP.SU » » Вопросы новичков » Пипл, ай ниид хелп. Вери-вери ниид.

Страниц (1): [1]
 

1. 4elentano - 15 Марта, 2012 - 23:26:48 - перейти к сообщению
Сочиняю сайт. первый свой рНр-сайт. уже почти готово, но мне приспичило следующее:
есть словарь терминов на сайте (психологических, да и сам сайт по психологии). если слово встречается в тексте сайта, хочу, чтобы оно автоматически выставлялось ссылкой на словарную статью, соответствующую названию этого слова. Надеюсь, внятно объяснил, если есть вопросы по самой задаче, отвечу со всем энтузиазмом, на который способен. Улыбка
Сложность:
понимаю, что это вполне реально, но какой-то ступор. Совершенно никаких идей, как это воплотить. Если у кого-то найдётся или опыт решения подобных задач или просто идеи, буду счаслив выслушать. Заранее спасибо за участие всем, кто откликнется.
2. DlTA - 15 Марта, 2012 - 23:34:54 - перейти к сообщению
на пальцах:
берется текст, разбирается на слова, сортируется, удаляются дубли,
дальше каждое оставшееся слово ищется в базе, если нашлось, то это слово в исходном тексте подменяется на соответствующую ссылку

и желательно чтоб действия выполнялись единожды при добавлении текста, иначе база (и сайт) ляжет
3. 4elentano - 16 Марта, 2012 - 02:33:37 - перейти к сообщению
Угу. Спасибо, большое, DlTA. Хотел соответствующую кнопочку кликнуть, но пишет, что у меня пока мало постов для таких операций.
если я правильно понимаю, то выглядеть должно так:

PHP:
скопировать код в буфер обмена
  1. $text = 'tram-pam-pam tyk-dyk tararam';
  2. $t_array = explode(" ", $text); // дробим на слова
  3. $i = 0;
  4. while ($i < count($t_array)) // выбыраем в цикле айдишники словарных статей там, где они совпадают с текущим словом
  5. {
  6. $sql = mysql_query("SELECT id FROM table WHERE title = '$t_array[$i]'",$conn);
  7.     if ($sql)
  8.     {
  9.     $id = mysql_fetch_array($sql);
  10.     $t_array[$i] = "<a href='page.php?id=$id[id]'>$t_array[$i]</a>"; // меняем слово на ссылку на соответствующ. статью
  11.     }
  12. $i++;
  13. }
  14. $text = implode(" ", $t_array); // возвращаем текст в виде текста с пробелами между слов в исходную переменную


Так правильно?

DlTA пишет:
сортируется, удаляются дубли
- только не хватает знаний каким образом две эти операции осуществить ((
4. DelphinPRO - 16 Марта, 2012 - 02:58:49 - перейти к сообщению
4elentano пишет:
$t_array = explode(" ", $text); // дробим на слова

нужно еще учесть знаки препинания.
и HTML теги

сортировка - sort
удалить дубли - array_unique
5. shabalin - 16 Марта, 2012 - 05:25:53 - перейти к сообщению
В вашем скрипте будут создаваться миллионы запросов к базе, это не есть хорошо. К тому же, у вас будут запросы даже на те слова, которых в базе нет, что еще хуже.

Лучше сначала выбрать все записи из базы, занести это в словарь и заменить в исходном тексте нужные слова на ссылки, при этом не надо будет ни разбивать текст на слова, ни склеивать их из массива обратно в текст.

CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2.  
  3. $text = 'tram-pam-pam, pam-pam, tyk-dyk tararam!';
  4.  
  5. $dict = array(); // словарь
  6.  
  7. /**
  8.  * Запросим все записи сразу, чтобы не мучать базу
  9.  */
  10. $sql = mysql_query('SELECT id, title FROM table', $conn);
  11.  
  12. mysql_data_seek($sql, 0); // ставим указатель в начало результата
  13.  
  14. /**
  15.  * Заполним в цикле словарь для замены регулярным выражением
  16.  */
  17. while ($row = mysql_fetch_object($sql))
  18. {
  19.    $regexp = '#(' . preg_quote($row->title) . ')#i';
  20.    $dict[$regexp] = '<a href="page.php?id=' . $row->id . '">$1</a>';
  21. }
  22.  
  23. $text = preg_replace(array_keys($dict), array_values($dict), $text);
  24.  
  25. ?>


В приведенном примере, кстати, можно заменять на ссылки не только отдельные слова, но и словосочетания.

Для оптимизации можно кешировать результаты словаря $dict (в файл или память), но это уже навороты. Пока и так хватит.
6. 4elentano - 02 Апреля, 2012 - 15:50:03 - перейти к сообщению
shabalin, спасибо! Огромное спасибо. Разбираюсь пока с наполнением словарей. как только закончу - испробую код и отпишусь. Надеюсь, всё сработает на ура.

 

Powered by ExBB FM 1.0 RC1