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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Пипл, ай ниид хелп. Вери-вери ниид.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: стоит интересная задачка. помогите советом.
4elentano
Отправлено: 15 Марта, 2012 - 23:26:48
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Март 2012  


Помог: 0 раз(а)

[+]


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



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




на пальцах:
берется текст, разбирается на слова, сортируется, удаляются дубли,
дальше каждое оставшееся слово ищется в базе, если нашлось, то это слово в исходном тексте подменяется на соответствующую ссылку

и желательно чтоб действия выполнялись единожды при добавлении текста, иначе база (и сайт) ляжет
 
 Top
4elentano
Отправлено: 16 Марта, 2012 - 02:33:37
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Март 2012  


Помог: 0 раз(а)

[+]


Угу. Спасибо, большое, 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 пишет:
сортируется, удаляются дубли
- только не хватает знаний каким образом две эти операции осуществить ((
 
 Top
DelphinPRO
Отправлено: 16 Марта, 2012 - 02:58:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




4elentano пишет:
$t_array = explode(" ", $text); // дробим на слова

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

сортировка - sort
удалить дубли - array_unique

(Отредактировано автором: 16 Марта, 2012 - 02:59:39)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
shabalin
Отправлено: 16 Марта, 2012 - 05:25:53
Post Id



Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Март 2012  


Помог: 2 раз(а)




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

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

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 (в файл или память), но это уже навороты. Пока и так хватит.

(Отредактировано автором: 16 Марта, 2012 - 05:41:10)



-----
Winginx, локальный сервер для разработчиков PHP, Node.js, MongoDB и MySQL
http://winginx.ru/
 
 Top
4elentano
Отправлено: 02 Апреля, 2012 - 15:50:03
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Март 2012  


Помог: 0 раз(а)

[+]


shabalin, спасибо! Огромное спасибо. Разбираюсь пока с наполнением словарей. как только закончу - испробую код и отпишусь. Надеюсь, всё сработает на ура.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB