[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Подсветка ключевого слова
m4a1fox
Добрый день уважаемые эксперты. Прошу подсказки, где не прав.
Делаю так

//функция оюрезки тегов
function cutTegs($r)
{
$desc = strtr($r,
array('<p>' => '', '</p>' => '',
'<p> </p>' => '', ' ' => ' '));
return $desc;
}

//Подсветка найденного слова
$desc = preg_replace("#($search)#iu",
"<span style='background-color: yellow;'>$1</span>", $ind['description']);


вывожу все это вот так

'.cutTegs($desc).'


собственно вопрос.
Попытался объеденить в одну функцию

function cutTegs($r)
{
$desc = strtr($r,
array('<p>' => '', '</p>' => '',
'<p> </p>' => '', ' ' => ' '));
$desc = preg_replace("#($search)#iu",
"<span style='background-color: yellow;'>$1</span>", $desc);

return $desc;
}

Но вылазят все теги, плус кодировка почему то меняется с utf8 на cp1251.... Если кто знает подскажите!



Спустя 4 часа, 33 минуты, 21 секунда (6.04.2011 - 16:33) m4a1fox написал(а):
Ребят, ну что нет ни у кого идей?

Спустя 12 минут, 8 секунд (6.04.2011 - 16:45) Игорь_Vasinsky написал(а):
а не проще подсветку (замену) - делать на str_replace() ????

Спустя 2 минуты (6.04.2011 - 16:47) Игорь_Vasinsky написал(а):
$string = "Какая большая у Вас плюшка!"
$search = "плюшка";
$result = str_replace($search, "<b>".$search."</b>", $string)

Спустя 29 минут, 22 секунды (6.04.2011 - 17:17) m4a1fox написал(а):
Игорь_Vasinsky
Да, наверно легче... Спасибо. Буду так использовать! Сейчас попробую в функцию запихнуть.

Спустя 8 минут, 11 секунд (6.04.2011 - 17:25) m4a1fox написал(а):
Объясните, что делаю не так?

function light($text)
{
$desc = str_replace($search,
"<span style='background-color: yellow; padding: 1px;'>$search</span>", $text);
return $desc;
}

Спустя 4 минуты, 1 секунда (6.04.2011 - 17:29) Игорь_Vasinsky написал(а):
?????????

function light($text){
$text = str_replace($search, "<span style='background-color: yellow; padding: 1px;'>$search</span>", $text);
return $text;
}

Спустя 3 минуты, 32 секунды (6.04.2011 - 17:33) m4a1fox написал(а):
Игорь_Vasinsky
Не хочет функция работать!

Спустя 5 минут, 49 секунд (6.04.2011 - 17:38) Игорь_Vasinsky написал(а):
может

function light($text, $search){
$text = str_replace($search, "<span style='background-color: yellow; padding: 1px;'>".$search."</span>", $text);
return $text;}

Спустя 1 минута, 27 секунд (6.04.2011 - 17:40) m4a1fox написал(а):
Игорь_Vasinsky
Так так-же не получилось! Ошибку выдает

Спустя 11 минут, 47 секунд (6.04.2011 - 17:52) Игорь_Vasinsky написал(а):
чё за ошибка то хоть?

Спустя 4 минуты, 28 секунд (6.04.2011 - 17:56) m4a1fox написал(а):
Игорь_Vasinsky
Ошибка

Warning: Missing argument 2 for light(), called in /home/www.sitename.com/view_search.php
on line 128 and defined in /home/www.sitename.com/blocks/function.php on line 42

Спустя 13 минут, 6 секунд (6.04.2011 - 18:09) twin написал(а):

Спустя 49 секунд (6.04.2011 - 18:10) Игорь_Vasinsky написал(а):
он тебе гворит что аргумент 2 не указан при вызове функции

Я тебе ввиде шаблона показал как реализовать, а переменные то ты должен свои использовать

т.е. по моему примеру:

$text - текст в котором ищется совпадение с целью замены
$search - слово - которое должно подсветиться (поисковый запрос)

у тебя эти переменные объявлены?


Спустя 50 секунд (6.04.2011 - 18:11) m4a1fox написал(а):
twin
Спасибо! Это я листал в первой половине дня! Часа 3! Слишком сложно так как-то!

Спустя 5 минут, 32 секунды (6.04.2011 - 18:16) m4a1fox написал(а):
Игорь_Vasinsky
Да! Объявлены!

Спустя 3 минуты, 56 секунд (6.04.2011 - 18:20) m4a1fox написал(а):
Я думаю, что он не может определить $search.

Спустя 8 минут, 8 секунд (6.04.2011 - 18:28) Игорь_Vasinsky написал(а):
ну попробуй вывести их перед вызовом функции:

echo "Текст: ".$text."<br/>";
echo "Ищем это: ".$search."<br/>";

Спустя 14 минут, 34 секунды (6.04.2011 - 18:43) m4a1fox написал(а):
Игорь_Vasinsky
Я функцию пишу в другом файле... с этим же не может быть проблемы?

Спустя 44 секунды (6.04.2011 - 18:44) m4a1fox написал(а):
Игорь_Vasinsky
Если так

echo "Ищем это: ".$search."<br/>";

то все нормально! Она определяется.

Спустя 2 минуты, 58 секунд (6.04.2011 - 18:47) Игорь_Vasinsky написал(а):
а переменная $text выводиться ?

Не важно в каком файле ты вызываешь функцию, главное чтобы переменные были объявлены выше этой функции, либо явно - либо через include

Спустя 7 минут, 56 секунд (6.04.2011 - 18:55) m4a1fox написал(а):
Игорь_Vasinsky
Я думаю мы так в тупик придем. Вот код одной функции, которая вырезает пробелы и абзаци. Она находится в файле function.php

function cutTegs($r)
{
$desc = strtr($r, array('<p>' => '', '</p>' => '', '<p> </p>' => '', ' ' => ' '));
return $desc;
}

на странице вывода я ее вот так применяю

'.cutTegs($ind['description']).'

Эта функция - работает!
Если я на странице вывода сделаю вот так

$desc = str_replace($search, "<span style='background-color: yellow; padding: 1px;'>$search</span>", $ind['description']);


А при формировании текста выводить вот так

'.cutTegs($desc).'

То нормально все работает! Скажите, что не верно... просто хочу понять!

Спустя 5 минут, 47 секунд (6.04.2011 - 19:00) Игорь_Vasinsky написал(а):
вот блин, у тя строка, которая будт обрабатыватся этими функциями в какой переменной? в $r или $desc

function cutTegs($r){
$desc = strtr($r, array('<p>' => '', '</p>' => '', '<p> </p>' => '', ' ' => ' '));
return $desc;
}


ты указываешь в аргументах функции
$r
, а хочешь чтоб функция вернула
$desc
(return $desc;)

Спустя 1 минута, 28 секунд (6.04.2011 - 19:02) Игорь_Vasinsky написал(а):
запутал меня.

что работает, что не работает?

Спустя 2 минуты, 3 секунды (6.04.2011 - 19:04) m4a1fox написал(а):
Игорь_Vasinsky
Ясно. Исправил. Теперь запрос вот так выглядит.

function cutTegs($desc)
{
return strtr($desc, array('<p>' => '', '</p>' => '', '<p> </p>' => '', ' ' => ' '));
}

На странице вот атк применю

'.cutTegs($ind['description']).'

Спустя 7 минут, 30 секунд (6.04.2011 - 19:11) Игорь_Vasinsky написал(а):
т.е.

//объяви переменную
$r = $ind['description']);
//глумсь над ней
//вырезал теги абзаца


function cutTegs($r, $search){
$r = str_replace("<p>", "", $r);
$r = str_replace("</p>", "", $r);
//подсветил слово
$r = str_replace($search, "<span style='background-color: yellow; padding: 1px;'>$search</span>", $r);
return $r;
}




Спустя 3 минуты, 37 секунд (6.04.2011 - 19:15) m4a1fox написал(а):
Игорь_Vasinsky
Вот так сделал.

function cutTegs($desc)
{
$desc = strtr($desc, array('<p>' => '', '</p>' => '', '<p> </p>' => '', ' ' => ' '));
$desc = str_replace($search, "<span style='background-color: yellow; padding: 1px;'>$search</span>", $desc);
return $desc;
}

Вывод вот такой

'.cutTegs($ind['description']).'

Я не сравниваю $desc = $ind['description'].

Спустя 2 минуты, 29 секунд (6.04.2011 - 19:17) Игорь_Vasinsky написал(а):
а $search в функцию передать как аргумент не хочешь? Работает?

а вывод, я привык делать в виде переменных, а не функций

Спустя 45 секунд (6.04.2011 - 19:18) m4a1fox написал(а):
И тем не менее она не работает! ) Ладно, спасибо Вам большое, но видимо легде будет сделать вот так

$desc = str_replace($search, "<span style='background-color: yellow; padding: 1px;'>$search</span>", $ind['description']);

И при выводе делать так

'.cutTegs($desc).'

Спустя 1 минута, 19 секунд (6.04.2011 - 19:20) Игорь_Vasinsky написал(а):
ты $search в аргументе не передаёшь, и показывай хоть ошибки, которые вылетают

Спустя 4 минуты, 44 секунды (6.04.2011 - 19:24) m4a1fox написал(а):
Игорь_Vasinsky
Да все те же! Второй аргумент не определен!

Спустя 6 минут, 39 секунд (6.04.2011 - 19:31) Игорь_Vasinsky написал(а):
а добавить 2й аргумент не судьба?

function name(arg1, arg2)

второй аргумент у тебя $search


Спустя 3 минуты, 40 секунд (6.04.2011 - 19:35) m4a1fox написал(а):
Игорь_Vasinsky
Так он его не принимает (

Спустя 1 минута, 34 секунды (6.04.2011 - 19:36) Игорь_Vasinsky написал(а):
дайка код всей функции - которая выдаёт ошибку

Спустя 12 минут, 56 секунд (6.04.2011 - 19:49) m4a1fox написал(а):
Игорь_Vasinsky
Вот код.

function cutTegs($desc, $search)
{
$desc = strtr($desc, array('<p>' => '', '</p>' => '', '<p> </p>' => '', ' ' => ' '));
$desc = str_replace($search, "<span style='background-color: yellow; padding: 1px;'>$search</span>", $desc);
return $desc;
}

Спустя 2 минуты, 38 секунд (6.04.2011 - 19:52) Игорь_Vasinsky написал(а):
и $desc и $search - определены ранее вызова этой функции

и вылетает ошибка об отсутствии 2го аргумента?

Спустя 3 минуты, 46 секунд (6.04.2011 - 19:55) Invis1ble написал(а):
m4a1fox
Все правильно у тебя ошибка вылетает, ты ведь в ф-цию strtr() передаешь всего 2 аргумента, при 3-х необходимых.

Спустя 33 секунды (6.04.2011 - 19:56) m4a1fox написал(а):
Игорь_Vasinsky
Применяю ее вот так.

'.cutTegs($ind['description']).'


$desc - не определена, но это не мешает ей работать. На странице при выборке из БД $ search = $_POST['search'];

Насколько я понимаю - это значит что она определена!

Спустя 1 минута, 36 секунд (6.04.2011 - 19:58) m4a1fox написал(а):
Invis1ble
Не в strtr дело. Даже если его убрать, то функция не работает!

Спустя 3 минуты, 40 секунд (6.04.2011 - 20:01) Invis1ble написал(а):
m4a1fox
function cutTags($desc, $search)
{
$desc = str_replace($search, '<span style="background-color: yellow; padding: 1px;">' . $search . '</span>', $desc);
return $desc;
}

$source = 'Hello, World!';
$keyword = 'Hello';
echo cutTags($source, $keyword);

Спустя 2 минуты, 7 секунд (6.04.2011 - 20:03) Игорь_Vasinsky написал(а):
strtr() может вызываться с двумя аргументами. В этом случае from должен быть массивом, индексы которога трактуются как строки поиска, а соответствующие значения - как строки замены. strtr() в первую очередь заменяет более длинные подстроки, причем одна и та же строка поиска используется только один раз.
Пример кода

<?php 
$trans = array("hello" => "hi", "hi" => "hello");
echo strtr("hi all, I said hello", $trans);
?>


->

покажи сам нотис, какая функция вызывает ошибку.

Спустя 1 минута, 37 секунд (6.04.2011 - 20:05) Invis1ble написал(а):
Игорь_Vasinsky
Точно, может. Я просто никогда ей не пользовался..

Спустя 4 минуты, 19 секунд (6.04.2011 - 20:09) Игорь_Vasinsky написал(а):
я тоже, понадеялся на ТС, твой код оригинален!

Спустя 4 минуты, 44 секунды (6.04.2011 - 20:14) Invis1ble написал(а):
Игорь_Vasinsky
Цитата
твой код оригинален!

В смысле?
Кстати, вот, имхо, как проще можно абзацы вырезать:
function cutTags($desc, $search)
{
$desc = preg_replace('#</?p>#sui', '', $desc);
$desc = str_replace($search, '<span style="background-color: yellow; padding: 1px;">' . $search . '</span>', $desc);
return $desc;
}

$source = '<p>Hello,</p><p>World!</p>';
$keyword = 'Hello';
echo cutTags($source, $keyword);

Спустя 2 минуты, 47 секунд (6.04.2011 - 20:17) m4a1fox написал(а):
Invis1ble
Игорь_Vasinsky
Спасибо. Сделал правда 2 разными функциями, но все же работает! Если интересно, то есделал вот так

function cutTegs($desc)
{
return strtr($desc, array('<p>' => '', '</p>' => '', '<p> </p>' => '', ' ' => ' '));
}

function light($desc, $search)
{
$desc = str_replace($search, '<span style="background-color: yellow; padding: 1px;">' . $search . '</span>', $desc);
return $desc;
}

А применяю вот так

'.light(cutTegs($ind['description']), $search).'

Скажите, это вообще нормально.. ну всмысле по коду... не убожество?

Спустя 2 минуты, 10 секунд (6.04.2011 - 20:19) Invis1ble написал(а):
m4a1fox
Посмотри мой предыдущий пост, там все в одной функции.

Спустя 19 секунд (6.04.2011 - 20:19) m4a1fox написал(а):
Invis1ble
Цитата
$desc = preg_replace('#</?p>#sui', '', $desc);

У меня там не только абзаци, но еще и

array('<p>' => '', '</p>' => '', '<p>& nbsp;</p>' => '', '& nbsp;' => ' ')

как видите еще и пробелы, и абзац с пробелом)

Спустя 1 минута, 36 секунд (6.04.2011 - 20:21) Игорь_Vasinsky написал(а):
ну работает и лан... главное что сам. а то я спать.

и... не за что. ты почти всё сам делал.
молодец.

Спустя 46 секунд (6.04.2011 - 20:22) Invis1ble написал(а):
m4a1fox
И что, ты собираешься все комбинации в массиве перечислять? Напиши регулярку и все будет норм.

Спустя 1 минута, 22 секунды (6.04.2011 - 20:23) Игорь_Vasinsky написал(а):
я убегаю... Твин тут... ща носом меня тыкать будет..или всех....

Спустя 1 минута, 10 секунд (6.04.2011 - 20:24) m4a1fox написал(а):
Invis1ble
Кстати. Ваш общий код, не выдает ничего. Тоесть текст пропадает.
Делаю вот так

function cutTags($desc, $search)
{
$desc = preg_replace('#</?p>#sui', '', $desc);
$desc = str_replace($search, '<span style="background-color: yellow; padding: 1px;">' . $search . '</span>', $desc);
return $desc;
}

а при выводе вот так

echo cutTags($ind['description'], $search);

Спустя 3 минуты, 1 секунда (6.04.2011 - 20:27) Invis1ble написал(а):
m4a1fox
Ну у тебя наверно не в юникоде текст. Замени
$desc = preg_replace('#</?p>#sui', '', $desc);

на
$desc = preg_replace('#</?p>#si', '', $desc);

Спустя 3 минуты, 10 секунд (6.04.2011 - 20:30) m4a1fox написал(а):
Цитата
Ну у тебя наверно не в юникоде текст

UTF8. перевел сайт уже наверно месяца 2 назад.

Спустя 2 минуты, 46 секунд (6.04.2011 - 20:33) Invis1ble написал(а):
m4a1fox
Покажи, что у тебя в $ind['description'] и в $search

Спустя 3 минуты, 6 секунд (6.04.2011 - 20:36) m4a1fox написал(а):
Invis1ble
) $ind['description'] текст вынимается из БД, а в $search - запрос, то есть слово, для поиска. Поэтому показать будет сложновато smile.gif

Спустя 1 минута, 42 секунды (6.04.2011 - 20:38) Invis1ble написал(а):
m4a1fox
Почему сложновато, не понял? Сложновато сделать echo и скопипастить сюда?

Спустя 3 минуты, 25 секунд (6.04.2011 - 20:41) m4a1fox написал(а):
Invis1ble
Так ведь при echo $ind['search'] - чистый текст. Так просто половина новости.

Спустя 4 минуты, 7 секунд (6.04.2011 - 20:46) Invis1ble написал(а):
m4a1fox
Так и не понял, в чем проблема.... Сильно объемный текст? Помести его в форумные теги [ more][ /more] (без пробелов только в тегах)

Спустя 2 минуты, 16 секунд (6.04.2011 - 20:48) m4a1fox написал(а):
Invis1ble
Да не проблема. Вот echo $ind['description'] одного из запроса в поиске

<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<
span class="Apple-style-span" style="border-collapse: collapse; font-family: Times, serif; ">
Президент России <a class="lp" href="http://www.lenta.ru/lib/14160889/"
style="color: rgb(54, 0, 152); border-bottom-style: solid; border-bottom-width: 1px;
border-bottom-color: rgb(54, 0, 152); "
>Дмитрий
<span style="background-color: yellow; padding: 1px;">Медведев</span></a>
назвал недопустимыми выражения о "крестовых походах" по поводу ситуации в Ливии, передает
<a href="http://www.rian.ru/" target="_blank" style="color: rgb(24, 61, 171); ">
РИА Новости</a>. Ранее с крестовым походом международную военную операцию
в Ливии сравнил премьер-министр
<a class="lp" href="http://www.lenta.ru/lib/14160711/" style="color: rgb(54, 0, 152);
border-bottom-style: solid; border-bottom-width: 1px;
border-bottom-color: rgb(54, 0, 152); "
>Владимир Путин</a>,
который также раскритиковал резолюцию СБ ООН по Ливии.</span>

Спустя 1 минута, 42 секунды (6.04.2011 - 20:50) Invis1ble написал(а):
m4a1fox
Из тебя все клещами вытаскивать нужно?? Я тебе написал
Цитата
Покажи, что у тебя в $ind['description'] и в $search

Вижу только $ind['description']....

Спустя 2 минуты, 41 секунда (6.04.2011 - 20:52) Invis1ble написал(а):
m4a1fox
Все прекрасно работает
function cutTags($desc, $search)
{
$desc = preg_replace('#</?p>#sui', '', $desc);
$desc = str_replace($search, '<span style="background-color: yellow; padding: 1px;">' . $search . '</span>', $desc);
return $desc;
}

$source =
'<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Times, serif; ">
<p>Президент России <a class="lp" href="http://www.lenta.ru/lib/14160889/"
style="color: rgb(54, 0, 152); border-bottom-style: solid; border-bottom-width: 1px;
border-bottom-color: rgb(54, 0, 152); ">Дмитрий
Медведев</a>
назвал недопустимыми выражения о "крестовых походах" по поводу ситуации в Ливии, передает
<a href="http://www.rian.ru/" target="_blank" style="color: rgb(24, 61, 171); ">
РИА Новости</a>.</p><p>Ранее с крестовым походом международную военную операцию
в Ливии сравнил премьер-министр
<a class="lp" href="http://www.lenta.ru/lib/14160711/" style="color: rgb(54, 0, 152);
border-bottom-style: solid; border-bottom-width: 1px;
border-bottom-color: rgb(54, 0, 152); ">Владимир Путин</a>,
который также раскритиковал резолюцию СБ ООН по Ливии.</p></span>'
;
$keyword = 'Медведев';
echo cutTags($source, $keyword);


UPDATE. Специально вставил теги <p>, чтоб показать, что все срабатывает корректно

Спустя 3 минуты, 2 секунды (6.04.2011 - 20:55) m4a1fox написал(а):
Invis1ble
Мне трудно понять.... Но не проблема.

$search = !empty($_POST['search']) ? $_POST[search] : '';

А в эттом случает я запросил слово - ЛИВИИ.
По скриптцу он должен был ее подсветить!

Спустя 1 минута, 34 секунды (6.04.2011 - 20:57) Invis1ble написал(а):
m4a1fox
Значит проблема в логике твоего скрипта, а не моей функции. Можешь проверить сам, выше я предоставил пример, чтоб ты мог сам убедиться в этом.

Спустя 3 минуты, 3 секунды (6.04.2011 - 21:00) Invis1ble написал(а):
m4a1fox
Кстати, если ты ввел именно "ЛИВИИ", то конечно ничего подсвечено не будет, т.к. в тексте слово находится в другом регистре. Замени в функции str_replace() на str_ireplace() и будет щастье smile.gif
Не будет щастье, потому что str_ireplace с utf-8 походу не работает...
Вобщем, нужно регулярками все делать )

Спустя 5 минут, 7 секунд (6.04.2011 - 21:05) m4a1fox написал(а):
Invis1ble
Все получилось. Спасибо.

Спустя 2 минуты, 32 секунды (6.04.2011 - 21:07) Invis1ble написал(а):
m4a1fox
Вобще говоря, это очень примитивная функция. Советую тебе поглубже изучить работы формучан, на которые тебе дал ссылку twin еще в начале треда (там кстати и моя есть smile.gif ).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.