X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )

2 страниц Открыть меню   1 2 >  
Ответить в данную темуНачать новую тему
> Выделение ключевых слов.
Jon
сообщение 2009-08-23, 12:17
Сообщение #1
Любитель
Иконка группы

Группа: Бета-тестеры
Сообщений: 282
Регистрация: 2009-07-12
Из: Москва

Репутация:   нет  
Всего: 0


Было бы супер сделать этот модуль с подробной настройкой.
Допустим, имеем на сайте ключевое слово "кактус". Если это слово прописано в админке и настроенно чтобы оно отображалось так: <a href="pages/кактус.html" alt="кактус" title="кактус"><b>кактус</b></a> то оно автоматически так и замениться.
Это ужасно полезно для СЕО.

Спс.
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2009-08-23, 14:30
Сообщение #2
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


Идея хорошая. Каким образом Вы предлагаете это сделать? - Когда страница сформирована, нужно ее всю (страницу) пропустить через какую-то функцию, которая обрамит каждое заданое слово в теги? Так?
Перейти в начало страницы
+Цитировать сообщение
Jon
сообщение 2009-08-23, 18:08
Сообщение #3
Любитель
Иконка группы

Группа: Бета-тестеры
Сообщений: 282
Регистрация: 2009-07-12
Из: Москва

Репутация:   нет  
Всего: 0


Нет. Функция работает при отображении текста. Ведь со временем ключи могут добавляться.....

Делаем настройку в админке так:

Введите ключевое слово: "Кактус"
Ссылка для первого ключевого слова: сайт.ру/pages/кактус.html (галочка активации и поле для ввода URL)
Выделить ссылку: Окно выбора: (Жирным, курсивым, подчеркнутым, другой вариант).
Действие для всех остальных одинаковых ключей: Окно выбора: (Жирным, курсивым, подчеркнутым, выделить все одинаковые ключи ссылками, другой вариант).
______________________
Пишем статью:

На днях я купил красивый кактус. Мой кактус самый кактусовый кактус в мире! Я люблю твой кактус!!!
______________
Отображаем статью:

На днях я купил красивый <a href="pages/кактус.html" alt="кактус" title="кактус"><i>кактус</i></a>. Мой <b>кактус</b> самый кактусовый <b>кактус</b> в мире! Я люблю твой <b>кактус</b>!!!

_____________
При редактировании, статья без ссылок и т.д.

Сообщение отредактировал Jon - 2009-08-23, 18:15
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2009-08-23, 19:22
Сообщение #4
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


Цитата (Jon @ 23.8.2009, 18:08)
Функция работает при отображении текста.

Хорошо.. Когда наступает это самое отображение при выводе статьи или после формировании страницы? И как поступать, если в тексте, где нужно выделить слова будет картинка с альтом, допустим?

Цитата
На днях я купил красивый кактус. Мой кактус самый кактусовый кактус в мире! Я люблю твой кактус!!! <img src="kaktus.png" alt="Кактус" />


Цитата
На днях я купил красивый <a href="pages/кактус.html" alt="кактус" title="кактус"><i>кактус</i></a>. Мой <b>кактус</b> самый кактусовый <b>кактус</b> в мире! Я люблю твой <b>кактус</b>!!! <img src="kaktus.png" alt="<a href="pages/кактус.html" alt="кактус" title="кактус"><i>кактус</i></a>" />


Как Вы предлагаете обходить теги?
Перейти в начало страницы
+Цитировать сообщение
Jon
сообщение 2009-08-23, 19:49
Сообщение #5
Любитель
Иконка группы

Группа: Бета-тестеры
Сообщений: 282
Регистрация: 2009-07-12
Из: Москва

Репутация:   нет  
Всего: 0


Цитата (Alexander @ 23.8.2009, 19:22)
Хорошо.. Когда наступает это самое отображение при выводе статьи или после формировании страницы? И как поступать, если в тексте, где нужно выделить слова будет картинка с альтом, допустим?

Как Вы предлагаете обходить теги?

Наступает отображение при выводе статьи. При форматировании, статья без тегов, кодов - "оригинал" одним словом.


По поводу альтов не подумал... Но есть решение:
Сделать правило, которое даёт ключу обернуться в теги.
То есть, перед и после ключа должен быть пробел - если так выполняем действие.
Таким образом не будут затронуты словосочетания "кактусовый", "кактусный" и alt="кактус"
Но тогда возможны проблемы если alt="мой кактус !" ... тут уже я сдаюсь....

Сообщение отредактировал Jon - 2009-08-23, 20:15
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2009-08-23, 20:45
Сообщение #6
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


Jon, но ведь в альт тоже может быть разные. Например: "мой кактус справа".
Перейти в начало страницы
+Цитировать сообщение
Jon
сообщение 2009-08-23, 22:30
Сообщение #7
Любитель
Иконка группы

Группа: Бета-тестеры
Сообщений: 282
Регистрация: 2009-07-12
Из: Москва

Репутация:   нет  
Всего: 0


значит придётся делать правило, которое пропускает <img***>...
Но как его сделать, я не знаю....

Думаю.........
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2009-08-24, 10:05
Сообщение #8
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


Jon, нужно пропускать вообще все, что находится внутри тегов. Но как это сделать - пока не придумал. Будут идеи - пишите :)
Перейти в начало страницы
+Цитировать сообщение
Гость_SHAKA1_*
сообщение 2009-08-24, 14:34
Сообщение #9



Гости





Как то давно пытался сделать для Slaed модуль "Ключевых слов", тоже хотел сделать функцию выделения ключевых слов в тексте вот что получилось, может пригодится:

function kw_strong ($kw, $text) {
$allowsim=&#39;("|\?|!|:|\&#39;|\.|\(|\)|;|-|\+|\#|№|\$|%|\^|&|\*|_|/|\\\\| |}|{|\[|\||\])&#39;;
$open_tag=&#39;<strong>&#39;;
$close_tag=&#39;</strong>&#39;;
$kwords = trim(preg_replace(&#39;/("|\?|!|:|\&#39;|\.|\(|\)|;|\\\\|\[|\||\])+/&#39;, &#39;&#39;, $kw));
$kwords = array_unique(explode(",", strtolower($kwords)));
$count = count($kwords);
for ($i=0;$i<$count;$i++) {
$kwords[$i]=trim($kwords[$i]);
$text = preg_replace("#".$open_tag."".$close_tag."#","",preg_replace(&#39;#(<[^<^>]*?>)|([^<>&#39;.$allowsim.&#39;(&#39;.$kwords[$i].&#39;)(&#39;.$allowsim.&#39;)]*)(&#39;.$allowsim.&#39;(&#39;.$kwords[$i].&#39;)&#39;.$allowsim.&#39;)#si&#39;, &#39;\\1\\2\\4&#39;.$open_tag.&#39;\\5&#39;.$close_tag.&#39;\\6&#39;, $text));
    }
return $text;
}


Цитата
echo kw_strong ('kaktus,кактус', 'На днях я купил красивый <strong>кактус</strong> (kaktus). Мой кактус самый кактусовый кактус в мире! Я люблю твой кактус!!! <img src=" kaktus .png" alt=" Кактус " />');


Цитата
На днях я купил красивый <strong>кактус</strong> (<strong>kaktus</strong>). Мой <strong>кактус</strong> самый кактусовый <strong>кактус</strong> в мире! Я люблю твой <strong>кактус</strong>!!! <img src=" kaktus .png" alt=" Кактус " />


Сообщение отредактировал SHAKA1 - 2009-08-24, 14:37
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2009-08-24, 15:38
Сообщение #10
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


SHAKA1, а насколько производителен этот алгоритм? Вы не могли бы описать что делает Ваша регулярка?
Перейти в начало страницы
+Цитировать сообщение
Гость_patriot_*
сообщение 2009-08-24, 20:18
Сообщение #11



Гости





я несколько дальше пошел)
на странице сайта можно выделить слово или словосочетание и в появившемся диалоге ввести описание для этого слова. все это сохраняется на сервере.
при выводе страницы (делал для новостей и статей, но в принципе нет разницы) все слова, для которых есть описание выделяются в тексте (настройка в css), а при наведении на них появляется то самое описание.
функция замены очень простая
function tips_parse($content, $tips=&#39;&#39;){
	global $db, $prefix;
	if (count($tips)==0) return $content;
	foreach($tips as $item){
		$patterns[]=&#39;#&#39;.$item[&#39;word&#39;].&#39;#is&#39;;
		$replacement[]=&#39;<span class="ref">&#39;.$item[&#39;word&#39;].&#39;<span class="descr">&#39;.$item[&#39;description&#39;].&#39;</span></span>&#39;;
	}
	return preg_replace($patterns, $replacement, $content);
}

в принципе идею можно развивать, улучшать

Цитата
Jon, нужно пропускать вообще все, что находится внутри тегов. Но как это сделать - пока не придумал. Будут идеи - пишите

можно не теги фильтровать, а title="..." и alt="...". и то и другое можно реализовать регулярными выражениями

Сообщение отредактировал patriot - 2009-08-24, 20:28
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2009-08-24, 20:45
Сообщение #12
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


patriot, мне кажется фильтровать нужно именно теги. Причем, желательно не на всей странице, а именно в новости. Почему именно теги? Мне кажется это более корректно и лишено множества проблем. Фильтровать теги регуляркой по-моиму просто невозможно. Значит, есть только два варианта - вырезанием и обходом. Вырезать теги - слишком ресурсоемко.. А вот обходить их - вполне нормальный вариант, но на большом объеме информации это ж.. Могу набросать вариант обхода тегов с заменой, если кому интересно и готов взяться за решение этой проблемы.
Перейти в начало страницы
+Цитировать сообщение
Гость_patriot_*
сообщение 2009-08-24, 23:33
Сообщение #13



Гости





по моему вполне можно фильтровать теги регуляркой... нужны ведь далеко не все теги. то, что внутри тега (например, <img....> или <a...>) не обрабатывать
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2009-08-24, 23:55
Сообщение #14
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


patriot, ну хорошо. Покажи свое решение.
Перейти в начало страницы
+Цитировать сообщение
Гость_Ripper_*
сообщение 2009-08-25, 9:41
Сообщение #15



Гости





ООООО ДААА!! Я сделал это!!
$a = &#39;word wOrd bla blaman, bla bla word word word megaword wordx ywordx <word word="word"> word, word. WORD! &#39;;
echo htmlspecialchars(kwm($a));
function kwm($text) {
	return preg_replace_callback(&#39;/(?<=>|^)([^<]*)/s&#39;, &#39;kw_bold&#39;, $text); // Заменяет текст вне тегов на результат работы kw_bold
}
function kw_bold($pk) { // Выделяет отдельные ключевые слова
	$words = array(&#39;word&#39;, &#39;bla&#39;); //  keywordZ !!!
	return preg_replace(&#39;!(?<=\W|^)(&#39;.join($words, &#39;|&#39;).&#39;)(?=\W|$)!is&#39;, &#39;<b>\1</b>\2&#39;, $pk[1]);
}

За быстродействие ногами не пинать.
UPD: хотя.. моё решение работает довольно шустро.

Сообщение отредактировал Ripper - 2009-08-25, 9:53
Перейти в начало страницы
+Цитировать сообщение
Гость_Ripper_*
сообщение 2009-08-25, 9:56
Сообщение #16



Гости





Вот, решил сравнить скорость работы мей функции и функции SHAKA1:
<?php
$a = &#39;word wOrd bla blaman, bla bla word word word megaword wordx ywordx <word word="word"> word, word. WORD! &#39;;

function kwm($text) {
	return preg_replace_callback(&#39;/(?<=>|^)([^<]*)/s&#39;, &#39;kw_bold&#39;, $text);
}
function kw_bold($pk) {
	$words = array(&#39;word&#39;, &#39;bla&#39;); //  Array of keywordZ
	return preg_replace(&#39;!(?<=\W|^)(&#39;.join($words, &#39;|&#39;).&#39;)(?=\W|$)!is&#39;, &#39;<b>\1</b>\2&#39;, $pk[1]);
}

function kw_strong ($kw, $text) {
$allowsim=&#39;("|\?|!|:|\&#39;|\.|\(|\)|;|-|\+|\#|No|\$|%|\^|&|\*|_|/|\\\\| |}|{|\[|\||\])&#39;;
$open_tag=&#39;<b>&#39;;
$close_tag=&#39;</b>&#39;;
$kwords = trim(preg_replace(&#39;/("|\?|!|:|\&#39;|\.|\(|\)|;|\\\\|\[|\||\])+/&#39;, &#39;&#39;, $kw));
$kwords = array_unique(explode(",", strtolower($kwords)));
$count = count($kwords);
for ($i=0;$i<$count;$i++) {
$kwords[$i]=trim($kwords[$i]);
$text = preg_replace("#".$open_tag."".$close_tag."#","",preg_replace(&#39;#(<[^<^>]*?>)|([^<>&#39;.$allowsim.&#39;(&#39;.$kwords[$i].&#39;)(&#39;.$allowsim.&#39;)]*)(&#39;.$allowsim.&#39;(&#39;.$kwords[$i].&#39;)&#39;.$allowsim.&#39;)#si&#39;, &#39;\\1\\2\\4&#39;.$open_tag.&#39;\\5&#39;.$close_tag.&#39;\\6&#39;, $text));
	}
return $text;
}

$time = microtime(true);
echo htmlspecialchars(kwm($a)).&#39;<br>&#39;;
printf(&#39;Time: %.5f s&#39;, microtime(true)-$time);
echo "<br><hr>";

$time = microtime(true);
echo htmlspecialchars(kw_strong(&#39;word, bla&#39;, $a)).&#39;<br>&#39;;
printf(&#39;Time: %.5f s&#39;, microtime(true)-$time);
?>

Результат:
<b>word</b> <b>wOrd</b> <b>bla</b> blaman, <b>bla</b> <b>bla</b> <b>word</b> <b>word</b> <b>word</b> megaword wordx ywordx <word word="word"> <b>word</b>, <b>word</b>. <b>WORD</b>!
Time: 0.00018 s

word <b>wOrd</b> <b>bla</b> blaman, <b>bla</b> bla <b>word</b> word <b>word</b> megaword wordx ywordx <word word="word"> word, <b>word</b>. <b>WORD</b>!
Time: 0.00096 s

Как видно, моя функция работает не только быстрее, но и не допускает ошибок, когда два кейворда идут подряд.
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2009-08-25, 15:51
Сообщение #17
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


Ripper, спасибо! Вот уже основная часть модуля есть. Может и за остальную возьмешься? :rolleyes:
Перейти в начало страницы
+Цитировать сообщение
Гость_patriot_*
сообщение 2009-08-25, 16:17
Сообщение #18



Гости





(?<!<)\bкактус\b(?!>)

такая регулярка найдет все ключи, не находящиеся внутри < >

Ripper, опередил.
разве нельзя обойтись только preg_replace однократно?
$words = array(&#39;word&#39;, &#39;bla&#39;); //  keywordZ !!!
return preg_replace(&#39;`(?<!<)\b(&#39;.join($words, &#39;|&#39;).&#39;)\b(?!>)`is&#39;, &#39;<b>\1</b>\2&#39;, $pk[1]);

так например. (из твоего примера)

сори.. перепроверил - моя регулярка недорабатывает )
твое решение корректное

Сообщение отредактировал patriot - 2009-08-25, 16:34
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2009-08-25, 16:45
Сообщение #19
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


patriot, твоя регулярка работает немного некорректно:
$a=&#39;<span title="word">word</span>&#39;;
$b=preg_replace(&#39;#(?<!<)\b(word)\b(?!>)#i&#39;,&#39;<b>word</b>&#39;,$a);
echo htmlspecialchars($b);

Выводит:
<span title="<b>word</b>"><b>word</b></span>


Сообщение отредактировал Alexander - 2009-08-25, 16:46
Перейти в начало страницы
+Цитировать сообщение
Гость_Ripper_*
сообщение 2009-08-25, 16:54
Сообщение #20



Гости





Цитата (Alexander @ 25.8.2009, 16:51)
Ripper, спасибо! Вот уже основная часть модуля есть. Может и за остальную возьмешься? :rolleyes:


А остальная часть -- что бы первое слово делал ссылкой, а все остальные просто выделял? Или модуль в админку?
Я как бы в eleanor не очень соображаю, не могу всё сам сделать( Только с консультацией в режиме реального времени через мессенджер :)

patriot,
ага... Я долго пытался одной регуляркой решить... У меня есть ещё идея как это сделать, но тогда надо будет пропустить текст через функцию столько раз, сколько кейвордов в тексте (а это не очень быстро :) )
UPD: Хотя... щас попробуем сравнить что быстрее...

Сообщение отредактировал Ripper - 2009-08-25, 16:55
Перейти в начало страницы
+Цитировать сообщение

2 страниц Открыть меню   1 2 >
Ответить в данную темуНачать новую тему
0 чел. читают эту тему (гостей: 0, скрытых пользователей: 0)
Пользователей: 0

 
RSS Текстовая версия 0.0398 сек.    12 запросов    GZIP включен    Сейчас: 2024-04-16, 19:19