Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: подсветка ключевых слов поискового запроса
 
 автор: Рома   (25.01.2009 в 16:12)   письмо автору
 
 

че то я затупил совсем.
есть запрос к базе, затем идет цикл.

$arr=explode(" ",$_GET['search']); 
$msconnect=mysql_connect($mshost, $msuser, $mspassword);
mysql_select_db($msname, $msconnect);
$sql="SELECT * FROM roma where "."msg  like '%".implode("%' and msg like '%",$arr)."%' union SELECT * FROM roma where "."msg like '%".implode("%' or msg like '%",$arr)."%'";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result))
{
$a=$row['a'];
$b=$row['b'];
$c=$row['c'];
echo "$a<br>$b<br>$c";
}


$b - статья.
$arr - массив ключевых слов.
вопрос1. как визуально изменить в $b совпадения с элементами массива $arr.
вопрос2. если в запросе будет присутствовать, к примеру буква "и", то подсветятся все-все буквы "и", правильно? можно как то объяснить коду, что достаточно только одного выделения "и" ?
либо как-то поставить ограничения на однобуквенные ключевые слова, от них ведь все равно нет пользы при поиске.

я пробовал так:
$b=preg_replase("массив ключевых слов", "заменить на их эквиваленты красным цветом", $b, разок) - результат нулевой.

подскажите в каком направлении двигаться

  Ответить  
 
 автор: nikita2206   (25.01.2009 в 16:53)   письмо автору
 
   для: Рома   (25.01.2009 в 16:12)
 

направление такое:
str_replace(implode($arr), '<span class="select">'.implode($arr).'</span>', 'переменная в которой хранится весь текст');

если надо чтоб отдельно из массива каждое значение выделяло, то это на цикле делай, оптять же с помощью str_replace

  Ответить  
 
 автор: nikita2206   (25.01.2009 в 17:04)   письмо автору
 
   для: nikita2206   (25.01.2009 в 16:53)
 

<?
$arr
=explode(" ",$_GET['search']);  
$msconnect=mysql_connect($mshost$msuser$mspassword); 
mysql_select_db($msname$msconnect); 
$sql="SELECT * FROM roma where "."msg  like '%".implode("%' and msg like '%",$arr)."%' union SELECT * FROM roma where "."msg like '%".implode("%' or msg like '%",$arr)."%'"
$result=mysql_query($sql); 
$var '';
while(
$row=mysql_fetch_array($result)) 

$a=$row['a']; 
$b=$row['b']; 
$c=$row['c']; 
$var .= $a.'<br>'.$b.'<br>'.$c;
}
$i 0;
while(isset(
$arr[$i])){
if(
strlen($arr[$i]) > 2){
$var str_ireplace($arr[$i], '<span class="select">'.$arr[$i].'</span>'$var);
}
$i++;
}
echo 
$var;


вот так это должно выглядеть

  Ответить  
 
 автор: Рома   (25.01.2009 в 17:23)   письмо автору
 
   для: nikita2206   (25.01.2009 в 17:04)
 

сколько вариантов не пробовал, всегла одна и та же ошибка:
Warning: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash in C:\Program Files\Apache Group\Apache\htdocs\search.php on line 141.
в переводе с английского:
Разделитель не должен быть буквенно-цифровой или слеш

  Ответить  
 
 автор: nikita2206   (25.01.2009 в 17:28)   письмо автору
 
   для: Рома   (25.01.2009 в 17:23)
 

вопервых , суть ошибки в том что в перловых рег экспах нужно ограничивать выражение, воттак: preg_replace('/(.*)....../', 'на что заменить', $var);
тобиш слэшами или еще чем(только не буквенно цифровым и не бэкслеш)

во вторых, вот выдерка с документации по пхп(http://www.php.su/functions/?str_replace):
Если не нужны сложные правила поиска/замены, использование этой функции(str_replace()) предпочтительнее ereg_replace() или preg_replace().

и зачем тогда вы сюда preg_replace влепили?

п.с. backslash - это обратный слэш, а просто слэш это совершенно другое, особенно в рег экспах

  Ответить  
 
 автор: Trianon   (25.01.2009 в 17:42)   письмо автору
 
   для: nikita2206   (25.01.2009 в 17:04)
 

Представьте себе, что текстом, в котором нужно выделить слова, является этот код из этого Вашего поста.
А слова, которые нужно выделить - span и select

  Ответить  
 
 автор: nikita2206   (25.01.2009 в 17:54)   письмо автору
 
   для: Trianon   (25.01.2009 в 17:42)
 

и????

  Ответить  
 
 автор: Trianon   (25.01.2009 в 17:58)   письмо автору
 
   для: nikita2206   (25.01.2009 в 17:54)
 

Не получается представить - попробуйте исполнить код.
Ничего хорошего не выйдет.

  Ответить  
 
 автор: nikita2206   (25.01.2009 в 18:20)   письмо автору
 
   для: Trianon   (25.01.2009 в 17:58)
 

тогда можно так:
<? 
$arr
=explode(" ",$_GET['search']);   
$msconnect=mysql_connect($mshost$msuser$mspassword);  
mysql_select_db($msname$msconnect);  
$sql="SELECT * FROM roma where "."msg  like '%".implode("%' and msg like '%",$arr)."%' union SELECT * FROM roma where "."msg like '%".implode("%' or msg like '%",$arr)."%'";  
$result=mysql_query($sql);  
$var ''
while(
$row=mysql_fetch_array($result)){  
 
$a=$row['a'];  
 
$b=$row['b'];  
 
$c=$row['c'];  
 
$var .= $a.'<br>'.$b.'<br>'.$c

$i 0;

while(isset(
$arr[$i])){ 
 if(
strlen($arr[$i]) > 2){ 
  if(!
preg_match('/<span class="select">'.$arr[$i].'</span>/'$var)){
   
$var str_ireplace($arr[$i], '<span class="select">'.$arr[$i].'</span>'$var); 
  }
 } 
 
$i++; 

echo 
$var;

  Ответить  
 
 автор: Trianon   (25.01.2009 в 18:25)   письмо автору
 
   для: nikita2206   (25.01.2009 в 18:20)
 

И что? второе из слов вообще останется не выделенным?

  Ответить  
 
 автор: nikita2206   (25.01.2009 в 18:33)   письмо автору
 
   для: Trianon   (25.01.2009 в 18:25)
 

нет, тут уж явно вы неправы
только если юзер наберет два одинаковыхх слова в запросе, то второе слово, понятное дело невыделится

  Ответить  
 
 автор: Trianon   (25.01.2009 в 18:42)   письмо автору
 
   для: nikita2206   (25.01.2009 в 18:33)
 

вот. Я минимально изменил Ваш код, выкинув из него всё несущественное.
<?php
$var 
file_get_contents(__FILE__);
$arr= array('span','select');

while(isset(
$arr[$i])){
 if(
strlen($arr[$i]) > 2){
  if(!
preg_match('/<span class="select">'.$arr[$i].'</span>/'$var)) {
   
$var str_ireplace($arr[$i], '<span class="select">'.$arr[$i].'</span>'$var);
  }
 }
 
$i++;
}
echo 
$var;
?>


Попробуйте довести его до минимально работоспособного.


PS. Это сложная задача. Я бы оставил Ваш ответ без внимания, если бы не одно но.
Когда для решения такой задачи предлагаются примочки решения, подобные Вашему, обычно сайт, до того особыми дырами не страдавший, становится уязвим для XSS-инъекций.

  Ответить  
 
 автор: nikita2206   (25.01.2009 в 19:04)   письмо автору
 
   для: Trianon   (25.01.2009 в 18:42)
 

вопервых я не знаю чтотакое xss, во вторых решение здесь, поммоему, удивительно простое, надо при замене
$arr[$i] на <span class="select">'.$arr[$i].'</span>, переменную заменять не на
<span class="select">'.$arr[$i].'</span>, а на ..... дальше писать мне неохото, вот листинг:

<?php 
$var 
file_get_contents(__FILE__); 
$arr= array('span','select'); 
$i 0;
while(isset(
$arr[$i])){ 
 if(
strlen($arr[$i]) > 2){ 
  
$word strtr($arr[$i], 'qwertyuiopasdfghjklzxcvbnm','здесь шестнадцатиричное представление всех английских символов для хтмл упорядоченных в стиле qwerty');
  
$var str_ireplace($arr[$i], '<span class="select">'.$word.'</span>'$var); 
 } 
 
$i++; 

echo 
$var
?>


незнаю "утер я тебе нос" или может опять чтото не так, в любом случае жду опровержения)

  Ответить  
 
 автор: nikita2206   (25.01.2009 в 19:08)   письмо автору
 
   для: nikita2206   (25.01.2009 в 19:04)
 

пс вобщем тут задача несложная, если в базе данных небудет хтмл тегов.... конечно надо все это до ума довести, возможно даже взять "базу" всех существующих хтмл тегов, чтоб неполучилось подмены имен тегов, простите за тафтологию

  Ответить  
 
 автор: Trianon   (25.01.2009 в 19:16)   письмо автору
 
   для: nikita2206   (25.01.2009 в 19:04)
 

Работающего кода я так и не увидел.

В базе данных теги не хранятся.
Там хранится текст.
Текст вполне может быть и такой, как в этом примере.

  Ответить  
 
 автор: nikita2206   (25.01.2009 в 23:37)   письмо автору
 
   для: Trianon   (25.01.2009 в 19:16)
 

щас голова болит... завтра наверн чтонить придумаю...
пока токо массив с шестнадцатиричным представлением символов в хтмл наваял

пс. с вашим подхом канеш, таак можно и любой сайт с обработчиком бб кодов сломать

  Ответить  
 
 автор: nikita2206   (25.01.2009 в 23:48)   письмо автору
 
   для: Trianon   (25.01.2009 в 19:16)
 

держи


<?php 
$var 
file_get_contents(__FILE__);
$text 'dsjksdhfjkdhsfjkhdjk nra span j aksnd najsdbj kbsajkdjbfsd sdf hsdgsdhfgs hdgfsdfgdshfg sdfgh dsgfysdgfhsd';
$replace = array(
'A' => '&#65;',
'B' => '&#66;',
'C' => '&#67;',
'D' => '&#68;',
'E' => '&#69;',
'F' => '&#70;',
'G' => '&#71;',
'H' => '&#72;',
'I' => '&#73;',
'J' => '&#74;',
'K' => '&#75;',
'L' => '&#76;',
'M' => '&#77;',
'N' => '&#78;',
'O' => '&#79;',
'P' => '&#80;',
'Q' => '&#81;',
'R' => '&#82;',
'S' => '&#83;',
'T' => '&#84;',
'U' => '&#85;',
'V' => '&#86;',
'W' => '&#87;',
'X' => '&#88;',
'Y' => '&#89;',
'Z' => '&#90;',
'a' => '&#97;',
'b' => '&#98;',
'c' => '&#99;',
'd' => '&#100;',
'e' => '&#101;',
'f' => '&#102;',
'g' => '&#103;',
'h' => '&#104;',
'i' => '&#105;',
'j' => '&#106;',
'k' => '&#107;',
'l' => '&#108;',
'm' => '&#109;',
'n' => '&#110;',
'o' => '&#111;',
'p' => '&#112;',
'q' => '&#113;',
'r' => '&#114;',
's' => '&#115;',
't' => '&#116;',
'u' => '&#117;',
'v' => '&#118;',
'w' => '&#119;',
'x' => '&#120;',
'y' => '&#121;',
'z' => '&#122;'
);
$arr = array('span''select');
$i 0;
while(isset(
$arr[$i])){
    if(
strlen($arr[$i]) > 2){
        
$word strtr($arr[$i], $replace);
        
$var preg_replace('/[^<]([[\w+][^"=]]*)'.$arr[$i].'.[^>]/''<span class="select">'.$word.'</span>'$var);
    }
    
$i++;
}
echo 
$var;

?>

  Ответить  
 
 автор: Trianon   (26.01.2009 в 00:33)   письмо автору
 
   для: nikita2206   (25.01.2009 в 23:48)
 

Скажите честно, Вы его запускали?
А лучше не говорите ничего, ей-богу...

  Ответить  
 
 автор: nikita2206   (26.01.2009 в 00:40)   письмо автору
 
   для: Trianon   (26.01.2009 в 00:33)
 

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

  Ответить  
 
 автор: Trianon   (26.01.2009 в 00:43)   письмо автору
 
   для: nikita2206   (26.01.2009 в 00:40)
 

Да я вообще то заглянул и в html-код , хотя имел право этого не делать.
слова остались невыделенными.

  Ответить  
 
 автор: Trianon   (26.01.2009 в 01:44)   письмо автору
 
   для: Trianon   (26.01.2009 в 00:43)
 

<style type="text/css">
 span.select{ color: #E02020 }
</style>
<?php

$var 
file_get_contents(__FILE__);
$arr = array('select''span');

$pattern '#('.implode('|'array_map('preg_quote'$arr)).')#';
$src 0;
$res '';

if(
preg_match_all($pattern$var$mPREG_OFFSET_CAPTURE))
  foreach(
$m[0] as $v)
  {
     if(
$v[1] > $src)
          
$res .= htmlspecialchars(substr($var$src$v[1]-$src));

     
$src $v[1] + strlen($v[0]);
     
$res .= '<span class="select">'.htmlspecialchars($v[0]).'</span>';
  }
$res .= htmlspecialchars(substr($var$src));

echo
'<pre>'.$res.'</pre>';

?>

Сырец.
Наверняка, этот код можно написать и поаккуратнее.

  Ответить  
 
 автор: Рома   (26.01.2009 в 10:27)   письмо автору
 
   для: Trianon   (26.01.2009 в 01:44)
 

с ошибкой разобрался, был не внимателен просто.

только вот почему не выделяет слово "продаются" при запросе "продаю"?
наверное нужно искать в сообщении и выделять последовательность букв, а не слово целиком?

  Ответить  
 
 автор: Loki   (26.01.2009 в 10:34)   письмо автору
 
   для: Trianon   (26.01.2009 в 01:44)
 

Все ждал кто же предложит этот вариант:)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования