|
|
|
| че то я затупил совсем.
есть запрос к базе, затем идет цикл.
$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, разок) - результат нулевой.
подскажите в каком направлении двигаться | |
|
|
|
|
|
|
|
для: Рома
(25.01.2009 в 16:12)
| | направление такое:
str_replace(implode($arr), '<span class="select">'.implode($arr).'</span>', 'переменная в которой хранится весь текст');
если надо чтоб отдельно из массива каждое значение выделяло, то это на цикле делай, оптять же с помощью str_replace | |
|
|
|
|
|
|
|
для: 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;
|
вот так это должно выглядеть | |
|
|
|
|
|
|
|
для: 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.
в переводе с английского:
Разделитель не должен быть буквенно-цифровой или слеш | |
|
|
|
|
|
|
|
для: Рома
(25.01.2009 в 17:23)
| | вопервых , суть ошибки в том что в перловых рег экспах нужно ограничивать выражение, воттак: preg_replace('/(.*)....../', 'на что заменить', $var);
тобиш слэшами или еще чем(только не буквенно цифровым и не бэкслеш)
во вторых, вот выдерка с документации по пхп(http://www.php.su/functions/?str_replace):
Если не нужны сложные правила поиска/замены, использование этой функции(str_replace()) предпочтительнее ereg_replace() или preg_replace().
и зачем тогда вы сюда preg_replace влепили?
п.с. backslash - это обратный слэш, а просто слэш это совершенно другое, особенно в рег экспах | |
|
|
|
|
|
|
|
для: nikita2206
(25.01.2009 в 17:04)
| | Представьте себе, что текстом, в котором нужно выделить слова, является этот код из этого Вашего поста.
А слова, которые нужно выделить - span и select | |
|
|
|
|
|
|
|
для: Trianon
(25.01.2009 в 17:42)
| | и???? | |
|
|
|
|
|
|
|
для: nikita2206
(25.01.2009 в 17:54)
| | Не получается представить - попробуйте исполнить код.
Ничего хорошего не выйдет. | |
|
|
|
|
|
|
|
для: 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;
|
| |
|
|
|
|
|
|
|
для: nikita2206
(25.01.2009 в 18:20)
| | И что? второе из слов вообще останется не выделенным? | |
|
|
|
|
|
|
|
для: Trianon
(25.01.2009 в 18:25)
| | нет, тут уж явно вы неправы
только если юзер наберет два одинаковыхх слова в запросе, то второе слово, понятное дело невыделится | |
|
|
|
|
|
|
|
для: 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-инъекций. | |
|
|
|
|
|
|
|
для: 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:04)
| | пс вобщем тут задача несложная, если в базе данных небудет хтмл тегов.... конечно надо все это до ума довести, возможно даже взять "базу" всех существующих хтмл тегов, чтоб неполучилось подмены имен тегов, простите за тафтологию | |
|
|
|
|
|
|
|
для: nikita2206
(25.01.2009 в 19:04)
| | Работающего кода я так и не увидел.
В базе данных теги не хранятся.
Там хранится текст.
Текст вполне может быть и такой, как в этом примере. | |
|
|
|
|
|
|
|
для: Trianon
(25.01.2009 в 19:16)
| | щас голова болит... завтра наверн чтонить придумаю...
пока токо массив с шестнадцатиричным представлением символов в хтмл наваял
пс. с вашим подхом канеш, таак можно и любой сайт с обработчиком бб кодов сломать | |
|
|
|
|
|
|
|
для: 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' => 'A',
'B' => 'B',
'C' => 'C',
'D' => 'D',
'E' => 'E',
'F' => 'F',
'G' => 'G',
'H' => 'H',
'I' => 'I',
'J' => 'J',
'K' => 'K',
'L' => 'L',
'M' => 'M',
'N' => 'N',
'O' => 'O',
'P' => 'P',
'Q' => 'Q',
'R' => 'R',
'S' => 'S',
'T' => 'T',
'U' => 'U',
'V' => 'V',
'W' => 'W',
'X' => 'X',
'Y' => 'Y',
'Z' => 'Z',
'a' => 'a',
'b' => 'b',
'c' => 'c',
'd' => 'd',
'e' => 'e',
'f' => 'f',
'g' => 'g',
'h' => 'h',
'i' => 'i',
'j' => 'j',
'k' => 'k',
'l' => 'l',
'm' => 'm',
'n' => 'n',
'o' => 'o',
'p' => 'p',
'q' => 'q',
'r' => 'r',
's' => 's',
't' => 't',
'u' => 'u',
'v' => 'v',
'w' => 'w',
'x' => 'x',
'y' => 'y',
'z' => 'z'
);
$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;
?>
|
| |
|
|
|
|
|
|
|
для: nikita2206
(25.01.2009 в 23:48)
| | Скажите честно, Вы его запускали?
А лучше не говорите ничего, ей-богу... | |
|
|
|
|
|
|
|
для: Trianon
(26.01.2009 в 00:33)
| | если б не запускал не давал бы, ты исходный код смотри, а не рендер... все работает отлично... а то что вы пугаетесь длинных кодов, это ваша проблема... | |
|
|
|
|
|
|
|
для: nikita2206
(26.01.2009 в 00:40)
| | Да я вообще то заглянул и в html-код , хотя имел право этого не делать.
слова остались невыделенными. | |
|
|
|
|
|
|
|
для: 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, $m, PREG_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>';
?>
|
Сырец.
Наверняка, этот код можно написать и поаккуратнее. | |
|
|
|
|
|
|
|
для: Trianon
(26.01.2009 в 01:44)
| | с ошибкой разобрался, был не внимателен просто.
только вот почему не выделяет слово "продаются" при запросе "продаю"?
наверное нужно искать в сообщении и выделять последовательность букв, а не слово целиком? | |
|
|
|
|
|
|
|
для: Trianon
(26.01.2009 в 01:44)
| | Все ждал кто же предложит этот вариант:) | |
|
|
|
|