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

Форум Регулярные Выражения

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

 

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

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

тема: Поиск в строке похожих слов
 
 автор: Лена   (07.10.2008 в 16:37)   письмо автору
 
 


<?php
$text 
"Получить контент другого сайта средствами PHP очень просто. 
Для этого существует ряд полезных функций, которые можно смело задействовать для этих
 целей. Самый простой вариант - получение контента при помощи функции file_get_contents. 
Достаточно передать URL в качестве параметра этой функции и она вернет полученный контент
 или false - в случае неудачи. Но мы легких путей не ищем, поэтому дальше рассмотрим более 
сложную функцию, обладающую рядом дополнительных и полезных качеств. "

$word "контент";
preg_match_all ("#(\S+\s+){1,10}" $word "(\s+\S+){1,10}#is"$text$outPREG_PATTERN_ORDER); 
//print_r($out[0]);
for($i=0;$i<count($out[0]);$i++){
$ann str_replace($word"<strong>" $word "</strong>"$out[0][$i]);
echo 
'...'$ann .'...<br>'
}
?> 


Как сделать так, чтобы находило не только слово "контент", а и производные от него, с одинаковым корнем: контента, контенту, контентный?

  Ответить  
 
 автор: BinLaden   (07.10.2008 в 17:18)   письмо автору
 
   для: Лена   (07.10.2008 в 16:37)
 

Можно воспользоваться [url=http://forum.dklab.ru/php/advises/HeuristicWithoutTheDictionaryExtrac tionOfARootFromRussianWord.html]этим[/url] классом

<?php
# ...

$stemmer = new Lingua_Stem_Ru;

$text 'Получить контент другого сайта средствами PHP очень просто.
Для этого существует ряд полезных функций, которые можно смело задействовать для этих целей.
Самый простой вариант - получение контента при помощи функции file_get_contents.
Достаточно передать URL в качестве параметра этой функции и она вернет полученный контент или false - в случае неудачи.
Но мы легких путей не ищем, поэтому дальше рассмотрим более сложную функцию, обладающую рядом дополнительных и полезных качеств. '
;
$word 'контент';

$text preg_replace('/' preg_quote($stemmer->stem_word($word), '/') . '\\S*/i''<b>\\0</b>'$text);

echo 
$text;
?>


P.S. И почему бы разработчикам форума не устранить баг?

  Ответить  
 
 автор: Лена   (07.10.2008 в 17:26)   письмо автору
 
   для: BinLaden   (07.10.2008 в 17:18)
 

Перехожу по Вашей ссылке - пишет "Темы, которую вы запросили, не существует"

  Ответить  
 
 автор: BinLaden   (07.10.2008 в 17:31)   письмо автору
 
   для: Лена   (07.10.2008 в 17:26)
 

Нужно убрать из ссылки пробел. Это форум распотрошил URL. Вот альтернативный линк: http://forum.dklab.ru/viewtopic.php?t=14279

  Ответить  
 
 автор: Лена   (07.10.2008 в 17:55)   письмо автору
 
   для: BinLaden   (07.10.2008 в 17:31)
 

Спасибо. Буду разбираться. Но вы все-таки загляните в эту тему еще завтра.

  Ответить  
 
 автор: Лена   (08.10.2008 в 10:38)   письмо автору
12.4 Кб
 
   для: Лена   (07.10.2008 в 17:55)
 

Все получилось. Я вам очень благодарна.
Тут еще один момент можно сделать. Можно поставить условие: если пользователь вводит английское слово, подключаем английский вариант стеммера, если на русском - русский(тот, что Вы дали). Получается, тогда тоже придется делать проверку через регулярные выражения - если слово состоит из #[A-Za_z]?# или из #[A-Яa_я]?#
Английский вариант стеммера я присоединила.
И тут делается то же самое:

<?php
include("stem_eng.php");
$stemm = new PorterStemmer();
$s "false";
$t "ability";
echo 
$stemm->Stem($s) . "<br>";
echo 
$stemm->Stem($t) . "<br>";
?>


Одно плохо: стеммер не работает для русских сложносокращенных слов(запчасти, роддом, авиазавод, спецодежда) и сложных слов, в которых две и больше основы - типа паровозоремонтный, железнодорожный, приборостроительный, школа-интернат, гуси-лебеди. Если в этих словах будут искаться слова ремонт, паровоз, прибор, строитель и т.д. - стеммер их не найдет, он просто отбросит ненужные суффиксы и окончания и на этом его работа закончится.
Вопрос один невыясненный остался:
в регулярном выражении, которое вы даете, есть вот такой кусок: '\\S*/i' .
\S - все не слова, а зачем еще один обратный слеш? Фридла я сейчас читаю, но наверное, до этого места еще не дочитала.

  Ответить  
 
 автор: BinLaden   (08.10.2008 в 12:35)   письмо автору
 
   для: Лена   (08.10.2008 в 10:38)
 

> Одно плохо: стеммер не работает для русских сложносокращенных слов(запчасти, роддом, авиазавод, спецодежда)
Ну коли Ваш механизм поиска находит эти слова, то может вообще отказаться от стеммеров и просто выделять все буквы слов, начинающихся на "зап...", "род...", "авиа..."?

То есть
<?php
$text 
preg_replace('/\\b(' preg_quote($stemmer->stem_word($word), '/') . '[a-zA-Zа-яА-Я\\d-]*)/i''<b>\\1</b>'$text);
?>


> \S - все не слова, а зачем еще один обратный слеш?

К регулярным выражениям это не относится, это относится к правилам формирования литеральных констант в PHP. Когда Вы пишите
<?php
echo '\\S';
?>

, то будет выведено просто "\S".

Хотя, конечно, допускается и обычная запись
<?php
echo '\S';
?>

, которая тоже выведет "\S", так как для парсера PHP такая последовательность неизвестна.

  Ответить  
 
 автор: Лена   (09.10.2008 в 14:24)   письмо автору
4.5 Кб
 
   для: BinLaden   (08.10.2008 в 12:35)
 

Не получается применить стеммер внутри скрипта. Коротко, что я делаю. Читаю каждый файл определенной директории, ищу слово, если слово есть, считается, сколько раз встречается слово в файле и выводится ссылка на статью, в которой слово найдено.
Ссылки выводятся в зависимости от релевантности слова. От большего - к меньшему.
Дальше каждая ссылка открывается - читается файл, все найденные слова и их словоформы подсвечиваются.

Проблема в том, что стеммер работает только тогда, когда ссылки уже открываются.
В самом же начале, когда я выясняю, есть ли в файле данное слово, его словоформы не находятся - я не знаю, как здесь стеммер подключить (это строка 39). Поэтому дальше, когда я проверяю существование ключа в массиве - стр. 42 if(array_key_exists($word, $count)){ - проверяется существование слова, но не его словоформ.
Как в строке 42 вместо $word впихнуть массив совпадений, который получается в результате работы стеммера?

  Ответить  
 
 автор: BinLaden   (09.10.2008 в 15:45)   письмо автору
 
   для: BinLaden   (08.10.2008 в 12:35)
 

Посоветовал отказаться от стеммера и в примере его сам использовал :))

  Ответить  
 
 автор: Лена   (09.10.2008 в 15:54)   письмо автору
 
   для: BinLaden   (09.10.2008 в 15:45)
 

Чтобы загладить свою вину, вам нужно внимательно прочитать мой предыдущий пост.
Проблема не решена.
Первоначально в файлах ищется слово, а не его словоформы. Как здесь подключить стеммер? Не буду я от него отказываться, если что-то сама придумаю, сообщу

  Ответить  
 
 автор: BinLaden   (09.10.2008 в 16:37)   письмо автору
 
   для: Лена   (09.10.2008 в 15:54)
 

<?php

# ...

    
$stem $stemmer->stem_word($word);

    
# ...

        
while (false !== ($file readdir($handle))) {

        
# ...

        
$count preg_match_all('/\\b' preg_quote($stem'/') . '/i'$r);
        unset(
$m);
        
        if( 
$count ){

            
# ...        

        
}
    }

# ...

?>

  Ответить  
 
 автор: Лена   (10.10.2008 в 10:03)   письмо автору
5.4 Кб
 
   для: BinLaden   (09.10.2008 в 16:37)
 

Получилось. Прикрепила файл. Если что-то неправильно, поправьте.
Не получилось одно.
Строка 53 - здесь у меня $all_value считает, сколько слов найдено в одном файле. У меня предыдущее значение почему-то не приплюсовывается к настоящему числу. Мне это важно, потому что дальше я сортирую полученный массив по убыванию. Можете мне помочь?

  Ответить  
 
 автор: BinLaden   (10.10.2008 в 10:25)   письмо автору
 
   для: Лена   (10.10.2008 в 10:03)
 

Всё-таки сделали по-своему...

> Строка 53 - здесь у меня $all_value считает, сколько слов найдено в одном файле. У меня предыдущее значение почему-то не приплюсовывается к настоящему числу. Мне это важно, потому что дальше я сортирую полученный массив по убыванию. Можете мне помочь?

Просто замените этот кусок кода:

<?php
        
//с помощью стеммера находим все формы слова внутри файла
        
preg_match_all('/' preg_quote($stemmer->stem_word($word), '/') . '\\S*/i',$r$outPREG_PATTERN_ORDER);
        
$all_value 0;
                
//для каждого найденного слова определяем его релевантность
                
foreach($out[0] as $value_out){
                
//существует ли в массиве ключ = словоформам слова
                    
if(array_key_exists($value_out$count)){
                        
//число релевантности слова в текстовом файле
                        
$value $count[$value_out];
                        
//подсчитать количество найденных слов
                        
$all_value += $value;
                    }
                }
?>


На этот:

<?php
        $all_value 
preg_match_all('/\\b' preg_quote($stemmer->stem_word($word), '/') . '/i'$r); 
        unset(
$m);
?>

  Ответить  
 
 автор: Лена   (10.10.2008 в 13:16)   письмо автору
 
   для: BinLaden   (10.10.2008 в 10:25)
 

Вы в preg_match_all третий параметр $m пропустили, и учет регистра писать не надо - '/i' - потому как стеммер переводит все слова в нижний регистр и после применения стеммера нужно добавить \S*, чтобы искалось не только усеченное слово, но и все его суффиксы - окончания.
А по своему я сделала потому, что в ключах массива $count должны быть все найденные слова, если их там нет, зачем формировать пустые массивы?
Даже если я заменяю на ваш вариант, слова считаются неправильно по другой причине.
Допустим, я открываю тект, на который ведет найденная ссылка. В самом тексте подсвечиваются
все слова, которые ищет шаблон, вот такие они:
мастеров-отделочников
мастерство
мастера
мастера
мастера
мастера-отделочника
мастер-отделочник
мастер

Но при формировании ссылок на файлы(тот кусок, что вы советовали поменять) на выходе у меня получается массив $out[0]: Array ( [0] => мастеров [1] => мастерство [2] => мастера [3] =>
мастер ). В итоге результат - найдено 4 слова. Получается, если слово повторяется, оно в
массив не заносится и не считается.

Как вот в этом выражении
preg_match_all('/\\b' . preg_quote($stemmer->stem_word($word), '/') . '\S*/',$r, $out, PREG_PATTERN_ORDER);


учесть, что если слово повторяется, то забрать в массив все его повторы? У вас же опыта и
знаний раз в десять больше, чем у меня, помогите, пожалуйста.

  Ответить  
 
 автор: BinLaden   (10.10.2008 в 17:34)   письмо автору
 
   для: Лена   (10.10.2008 в 13:16)
 

> Вы в preg_match_all третий параметр $m пропустили
Да, извиняюсь, дописать забыл. Да и забыл, потому что он нам не нужен, но требуется для вызова.

> и учет регистра писать не надо - '/i' - потому как стеммер переводит все слова в нижний регистр
Он-то может и переводит, а слова в файлах тоже все в нижнем регистре?

> после применения стеммера нужно добавить \S*
В данном случае не нужно, так как мы считаем количество совпадений, а не выуживаем эти совпадения. См. ниже

> А по своему я сделала потому, что в ключах массива $count должны быть все найденные слова, если их там нет, зачем формировать пустые массивы?
Я Вас, к сожалению, не понял. Пожалуй, я не совсем верно выбрал название переменной в первый раз: нужно было написать $all_value, как у Вас, а не $count -- это Вас смутило, думаю. Во второй исправился.

> Но при формировании ссылок на файлы(тот кусок, что вы советовали поменять) на выходе у меня получается массив $out[0]: Array ( [0] => мастеров [1] => мастерство [2] => мастера [3] =>
мастер )
Зачем Вам вообще этот массив $out? preg_match_all() возвращает кол-во совпадений -- это Вам и нужно, насколько я понял.

  Ответить  
 
 автор: uvajs   (14.11.2010 в 12:33)   письмо автору
 
   для: BinLaden   (10.10.2008 в 17:34)
 

Пожалуйста, кто нибудь выложите рабочий скрипт, а то не понятно о чем Вы говорите

  Ответить  
 
 автор: uvajs   (14.11.2010 в 13:07)   письмо автору
 
   для: uvajs   (14.11.2010 в 12:33)
 

Лена Вы мне поможете???

  Ответить  
 
 автор: uvajs   (17.11.2010 в 18:14)   письмо автору
 
   для: uvajs   (14.11.2010 в 13:07)
 

Помогите разобраться хоть кто нибудь, очень помощь нужна

  Ответить  
 
 автор: Лена   (20.11.2010 в 00:32)   письмо автору
 
   для: uvajs   (14.11.2010 в 13:07)
 

>Лена Вы мне поможете???

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

  Ответить  
 
 автор: uvajs   (20.11.2010 в 18:32)   письмо автору
 
   для: Лена   (20.11.2010 в 00:32)
 

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

поисковая форма:


<form action="search.php" method="post" name="form_s">
<div align="center" style="margin-top:10px;"><img src="images/search.jpg" width="118" height="96"></div><br>

<div align="center"><span class="search_text">Поисковый запрос:<br><input name="search" type="text" size="25" maxlength="40" class="search_imput"></span></div>
<div align="center"><input class="formbutton" name="submit_s" type="submit" value="Искать"></div></form> 


и обработчик:

<? 
session_start
();
include (
"block/bd.php");
$cloudData mysql_query("SELECT tags.tag, tags.id, COUNT(posts_tags.tagid) AS posts_count 
                          FROM posts_tags 
                          LEFT JOIN tags ON posts_tags.tagid = tags.id
                          GROUP BY tags.id;"
,$db);        
        
    if (
mysql_num_rows($cloudData) == 0) {
        
$tagcloud false;
    } else {
        
$tagcloud = array();
        while (
$resCloudData mysql_fetch_array($cloudData)){
            
$tagcloud[] = $resCloudData;            
        }
        
    }
if (isset(
$_POST['submit_s']))
{
$submit_s $_POST['submit_s'];
}

if (isset(
$_POST['search']))
{
$search $_POST['search'];
}


$log =="";
$error="no"//флаг наличия ошибки





?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title><?php echo "Информация по запросу - $search?></title>
<link href="style.css" rel="stylesheet" type="text/css">
<link href="style2.css" rel="stylesheet" type="text/css">
<meta name="keywords" content="<?php echo $myrow["meta_k"];?>">
<meta name="description" content="<?php echo $myrow["meta_d"];?>">
<script type="text/javascript" src="js/swfobject.js"></script>
<script language="JavaScript" src="js/crumb.js"></script>
<link rel="icon" href="http://engells.com/favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="http://engells.com/favicon.ico" type="image/x-icon"> 
</head>

<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
<?php include("block/header.php");?>
  </tr>
  <tr>
    <td><table width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
<?php include("block/left_td.php"); ?>
        <td valign="top">
<?php

    
if (isset($submit_s))
{

if (empty(
$search) or strlen($search) <= 2)
{
        
$log .= "<li>Поисковый запрос не введен, либо он менее 4-х символов.</li>";
        
$error "yes";
}

$search trim($search);
$search stripslashes($search);
$search htmlspecialchars($search);

}
    
        
        
else 
{
        
$log .= "<li>Вы обратились к файлу без необходимых параметров.</li>";
        
$error "yes";    

}        
        
if(
$error=="no")
{        



$result1 mysql_query("SELECT * 
                        FROM data 
                        WHERE MATCH(text) AGAINST('
$search')",$db);



    
if (@
mysql_num_rows($result1) > )

{

$myrow1 mysql_fetch_array($result1);





do 
{
printf ("<div class='content3'>
         <a href='lessons.php?rub=%s&id=%s'>
         <img src='%s' class='mini_img' align='left' alt='*'></a>
         <p class='h4'><a href='lessons.php?rub=%s&id=%s'>%s</a></p>
         <p class='comment1'>Автор/Переводчик: %s</p><br clear='left'>
         <span>%s</span><br>
         <div  class='line_f'> </div>
         <span class='comment1'>Добавлен:  %s</span>
         &nbsp;&nbsp;
         <span class='comment1'>Просмотров: %s</span></div></div>
         </div>
         </div></div>"
,$myrow1["rub"],
                       
$myrow1["id"],
                       
$myrow1["mini_img"],
                       
$myrow1["rub"],
                       
$myrow1["id"],
                       
$myrow1["title"],
                       
$myrow1["author"],
                       
$myrow1["description"],
                       
$myrow1["date"],
                       
$myrow1["view"]);
}
while (
$myrow1 mysql_fetch_array($result1));
}
else
{
echo 
"<p>Информация по Вашему запросу на сайте не найдена!</p>";

}

}

else
//если ошибки есть

$log "<font color=#cc0000><strong></strong></font></p><ul style='font-family:Verdana; font-size:12px; border:2px solid #cc0000; padding:10px; margin:20px; width:570px;'>".$log."</ul>";

//Отправляем результат в массив
$GLOBALS['_RESULT'] = array(
'error' => 'yes',      
'er_mess' => $log);

echo 
"<div align='center'>$log</div>";









?>
            
            
            
      
</td>
<?php include("block/right_td.php");?>
      </tr>
    </table></td>
  </tr>
  <tr>
<?php include("block/footer.php");?>
  </tr>
</table>
</body>
</html>

  Ответить  
 
 автор: heed   (20.11.2010 в 21:13)   письмо автору
 
   для: uvajs   (20.11.2010 в 18:32)
 

ни php, ни regexp'ы в вашем коде не влияют на результаты поиска.

и тем более если хотите чтобы запрос возвращал только то что нужно (всмысле без получения абсолютно всех записей и поиска средствами php)
читайте о возможностях fulltext-поиска, в частности
SELECT ..... WHERE MATCH (.....) AGAINST ('......' IN BOOLEAN MODE);

заряжайте в запрос только корни искомых слов с операторами усечения (*),если хотите выжать как можно больше из возможностей
а лучше просто предоставьте пользователям выдирать логику OR|AND и добавлять эти самые операторы.

//кстати всё-же лучше с SQL_CALC_FOUND_ROWS и LIMIT
и
>
if (empty($search) or strlen($search) <= 2) 

        $log .= "<li>Поисковый запрос не введен, либо он менее 4-х символов.</li>"; 
        $error = "yes"; 


$search = trim($search); 
$search = stripslashes($search); 
$search = htmlspecialchars($search); 


несколько не то
///// опять-же читайте про fulltext и разбирайтесь что должно или не должно попадать в этот запрос

  Ответить  
 
 автор: heed   (21.11.2010 в 00:22)   письмо автору
 
   для: heed   (20.11.2010 в 21:13)
 

_

  Ответить  
 
 автор: Лена   (21.11.2010 в 00:14)   письмо автору
 
   для: uvajs   (20.11.2010 в 18:32)
 

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


<?php
<? 
session_start();
include (
"block/bd.php");

//tags.tag НЕ ДОЛЖНО ВЫТЯГИВАТЬСЯ В ГРУППИРУЮЩЕМ ЗАПРОСЕ
$cloudData mysql_query("SELECT tags.tag, tags.id, COUNT(posts_tags.tagid) AS posts_count    
                          FROM posts_tags 
                          LEFT JOIN tags ON posts_tags.tagid = tags.id
                          GROUP BY tags.id;"
,$db);        
        
    if (
mysql_num_rows($cloudData) == 0) {
        
$tagcloud false;
    } else {
        
$tagcloud = array();
        while (
$resCloudData mysql_fetch_array($cloudData)){//ВАМ НУЖНО, ЧТОБЫ РЕЗУЛЬТАТ ЗАПРОСА ВЕРНУЛ ТОЛЬКО АССОЦИАТИВНЫЙ МАССИВ. 
//КАКУЮ ФУНКЦИЮ НАДО ИСПОЛЬЗОВАТЬ?

            
$tagcloud[] = $resCloudData;            
        }
        
    }
if (isset(
$_POST['submit_s']))
{
$submit_s $_POST['submit_s'];
}

if (isset(
$_POST['search']))
{
$search $_POST['search'];
}


$log =="";
$error="no"//флаг наличия ошибки

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title><?php echo "Информация по запросу - $search?></title>    //ПОЧЕМУ ПЕРЕД ВЫВОДОМ В БРОУЗЕР НЕ ПРОИСХОДИТ ОБРАБОТКА СТРОК?ЧЕМ НУЖНО ОБРАБАТЫВАТЬ?
<link href="style.css" rel="stylesheet" type="text/css">
<link href="style2.css" rel="stylesheet" type="text/css">
<meta name="keywords" content="<?php echo $myrow["meta_k"];?>">  //ТО ЖЕ САМОЕ...
<meta name="description" content="<?php echo $myrow["meta_d"];?>"> //ТО ЖЕ САМОЕ...
<script type="text/javascript" src="js/swfobject.js"></script>
<script language="JavaScript" src="js/crumb.js"></script>
<link rel="icon" href="http://engells.com/favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="http://engells.com/favicon.ico" type="image/x-icon"> 
</head>

<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
<?php include("block/header.php");?>
  </tr>
  <tr>
    <td><table width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
<?php include("block/left_td.php"); ?>
        <td valign="top">
<?php

    
if (isset($submit_s))
{

if (empty(
$search) or strlen($search) <= 2)
{
        
$log .= "<li>Поисковый запрос не введен, либо он менее 4-х символов.</li>";   //ЗАЧЕМ ЗДЕСЬ <li> </li>? ЛУЧШЕ ЭТИ ТЕГИ ПЕРЕНЕСТИ В МЕСТО НЕПОСРЕДСТВЕННОГО ВЫВОДА ОШИБКИ
        
$error "yes";
}

$search trim($search);
$search stripslashes($search);   //ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ  stripslashes. ЗАЧЕМ ВЫ ЕЕ ИСПОЛЬЗУЕТЕ?
$search htmlspecialchars($search);//ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ  htmlspecialchars. ЕСТЬ ЛИ СМЫСЛ ЕЕ ЗДЕСЬ ИСПОЛЬЗОВАТЬ?

}
    
        
        
else 
{
        
$log .= "<li>Вы обратились к файлу без необходимых параметров.</li>";    //И ОПЯТЬ ФРАЗУ БЕРЕТЕ В <li>... К КАКОМУ ФАЙЛУ ВЫ ОБРАЩАЕТЕСЬ? ЗАЧЕМ ВАМ ЭТОТ ФАЙЛ?
        
$error "yes";    

}        
        
if(
$error=="no")
{        


 
//ГДЕ В ЗАПРОСЕ ЗАЩИТА ОТ SQL-ИНЪЕКЦИЙ?
$result1 mysql_query("SELECT * 
                        FROM data 
                        WHERE MATCH(text) AGAINST('
$search')",$db);



    
if (@
mysql_num_rows($result1) > )   //К ЧЕМУ ЗДЕСЬ @? ДЛЯ ЧЕГО СЛУЖИТ ЭТОТ СИМВОЛ?

{

$myrow1 mysql_fetch_array($result1);    //ВАМ НУЖНО, ЧТОБЫ РЕЗУЛЬТАТ ЗАПРОСА ВЕРНУЛ ТОЛЬКО АССОЦИАТИВНЫЙ МАССИВ. КАКУЮ ФУНКЦИЮ НАДО ИСПОЛЬЗОВАТЬ?





do                                            //ВМЕСТО  do {...} while () НАДО ИСПОЛЬЗОВАТЬ
{                                             // while ($myrow1 = mysql_fetch_array($result1)){printf (...)}
printf ("<div class='content3'>     
         <a href='lessons.php?rub=%s&id=%s'>
         <img src='%s' class='mini_img' align='left' alt='*'></a>
         <p class='h4'><a href='lessons.php?rub=%s&id=%s'>%s</a></p>
         <p class='comment1'>Автор/Переводчик: %s</p><br clear='left'>
         <span>%s</span><br>
         <div  class='line_f'> </div>
         <span class='comment1'>Добавлен:  %s</span>
         &nbsp;&nbsp;
         <span class='comment1'>Просмотров: %s</span></div></div>
         </div>
         </div></div>"
,$myrow1["rub"],                //ПОЧЕМУ ПЕРЕД ВЫВОДОМ В БРОУЗЕР НЕ ПРОИСХОДИТ ОБРАБОТКА СТРОК? КАКОЙ ФУНКЦИЕЙ НУЖНО ОБРАБАТЫВАТЬ?
                       
$myrow1["id"],
                       
$myrow1["mini_img"],
                       
$myrow1["rub"],
                       
$myrow1["id"],
                       
$myrow1["title"],
                       
$myrow1["author"],
                       
$myrow1["description"],
                       
$myrow1["date"],
                       
$myrow1["view"]);
}
while (
$myrow1 mysql_fetch_array($result1));  //ВАМ НУЖНО, ЧТОБЫ РЕЗУЛЬТАТ ЗАПРОСА ВЕРНУЛ ТОЛЬКО АССОЦИАТИВНЫЙ МАССИВ. КАКУЮ ФУНКЦИЮ НАДО ИСПОЛЬЗОВАТЬ?

}
else
{
echo 
"<p>Информация по Вашему запросу на сайте не найдена!</p>";

}

}

else
//если ошибки есть

$log "<font color=#cc0000><strong></strong></font></p><ul style='font-family:Verdana; font-size:12px; border:2px solid #cc0000; padding:10px; margin:20px; width:570px;'>".$log."</ul>";


//Отправляем результат в массив
$GLOBALS['_RESULT'] = array(                //ЭТО ЗАЧЕМ? ВЫ ЕГО ГДЕ-ТО ПОТОМ ИСПОЛЬЗУЕТЕ?
'error' => 'yes',      
'er_mess' => $log);

echo 
"<div align='center'>$log</div>";


?>
            
            
            
      
</td>
<?php include("block/right_td.php");?>
      </tr>
    </table></td>
  </tr>
  <tr>
<?php include("block/footer.php");?>
  </tr>
</table>
</body>
</html>





По основной проблеме.
Я - пользователь. Вбила в форму слово "урок" - мне надо найти все фразы, в которых есть это слово + фразы, где есть "урока, уроков".
Я нажала на кнопку. Дальше начинает работать скрипт, который вы написали. Скрипт будет искать все эти слова в базе или в файлах?
Если в базе - в каких полях базы должен производиться поиск?
Если в файлах - что содержится в этих файлах?

  Ответить  
 
 автор: uvajs   (21.11.2010 в 09:17)   письмо автору
 
   для: Лена   (21.11.2010 в 00:14)
 

>//tags.tag НЕ ДОЛЖНО ВЫТЯГИВАТЬСЯ В ГРУППИРУЮЩЕМ ЗАПРОСЕ
Теги выводятся нормально.

> //ЗАЧЕМ ЗДЕСЬ <li> </li>? ЛУЧШЕ ЭТИ ТЕГИ ПЕРЕНЕСТИ В МЕСТО НЕПОСРЕДСТВЕННОГО ВЫВОДА ОШИБКИ
Я сначала заношу ошибки в переменную: $log, потом если же есть ошибки в нижу есть вывод.

>//ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ stripslashes. ЗАЧЕМ ВЫ ЕЕ ИСПОЛЬЗУЕТЕ?
Чтобы убрать кавычки ("").

>//ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ htmlspecialchars. ЕСТЬ ЛИ СМЫСЛ ЕЕ ЗДЕСЬ ИСПОЛЬЗОВАТЬ?
Чтобы заменить <> на такие мнимоники &lt;&gt;

>//ГДЕ В ЗАПРОСЕ ЗАЩИТА ОТ SQL-ИНЪЕКЦИЙ?
Писать защищенные запросы я пока не умею так, как еще слаб в PHP.

>//ЭТО ЗАЧЕМ? ВЫ ЕГО ГДЕ-ТО ПОТОМ ИСПОЛЬЗУЕТЕ?
Если есть ошибки, заношу их в массив в переменную $log...

>Я - пользователь. Вбила в форму слово "урок" - мне надо найти все фразы, в которых есть это слово + фразы, где есть "урока, уроков".
Я нажала на кнопку. Дальше начинает работать скрипт, который вы написали.
Да все Правильно!

>Скрипт будет искать все эти слова в базе или в файлах?
Да, в поле TEXT

  Ответить  
 
 автор: Trianon   (21.11.2010 в 16:15)   письмо автору
 
   для: uvajs   (21.11.2010 в 09:17)
 

>>//tags.tag НЕ ДОЛЖНО ВЫТЯГИВАТЬСЯ В ГРУППИРУЮЩЕМ ЗАПРОСЕ
>Теги выводятся нормально.
Ответ неверный. Мне (как и Лене) не интересно, как они выводятся.
Мне интересно, чтобы в исходном тексте не было кода, афтор которого не понимает, как он работает.
А этот код помимо всего прочего, еще и формально некорректный.


>> //ЗАЧЕМ ЗДЕСЬ <li> </li>? ЛУЧШЕ ЭТИ ТЕГИ ПЕРЕНЕСТИ В МЕСТО НЕПОСРЕДСТВЕННОГО ВЫВОДА ОШИБКИ
>Я сначала заношу ошибки в переменную: $log, потом если же есть ошибки в нижу есть вывод.
Ответ неверный. <li></li> сами по себе об шибках не говорят ничего. Заносить их не требуется.
.

>>//ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ stripslashes. ЗАЧЕМ ВЫ ЕЕ ИСПОЛЬЗУЕТЕ?
>Чтобы убрать кавычки ("").
Ответ неверный. Эта функция никакие кавычки не убирает. Кстати, зачем Вам убирать кавычки? Чем они Вам не угодили в сравнении с другими буквами, знаками, цифрами?


>>//ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ htmlspecialchars. ЕСТЬ ЛИ СМЫСЛ ЕЕ ЗДЕСЬ ИСПОЛЬЗОВАТЬ?
>Чтобы заменить <> на такие мнимоники &lt;&gt;
Что еще за мнемоники? кому они улучшают память?
Зачем менять символы на мнемоники? Чем символы плохи?


>>//ГДЕ В ЗАПРОСЕ ЗАЩИТА ОТ SQL-ИНЪЕКЦИЙ?
>Писать защищенные запросы я пока не умею так, как еще слаб в PHP.
Писать Вы никакие запросы не умеете, однако ж пытаетесь.


>>//ЭТО ЗАЧЕМ? ВЫ ЕГО ГДЕ-ТО ПОТОМ ИСПОЛЬЗУЕТЕ?
>Если есть ошибки, заношу их в массив в переменную $log...

>>Я - пользователь. Вбила в форму слово "урок" - мне надо найти все фразы, в которых есть это слово + фразы, где есть "урока, уроков".
>Я нажала на кнопку. Дальше начинает работать скрипт, который вы написали.
>Да все Правильно!
>
>>Скрипт будет искать все эти слова в базе или в файлах?
>Да, в поле TEXT

Ответ неверный.
В базе или в файле?
ни у базы, ни у файлов полей нет!

У меня к Вам отдельная порция вопросвов.
Почему Вы считаете себя вправе грузить на рассмотрение код, в котором не расставлены отступы согласно вложенным составным операторам?
Вы полагаете, что расставлять их за Вас приятное и веселое занятие?
Почему первой исполняемой строкой скрипта не стоит error_reporting(E_ALL); ?
Вы возможно уже настолько опытны, что предупреждений php Вам видеть не нужно.
Мы же тут все сплошь новички, и догадываться о том, что нехорошего тихо происходит у Вас в коде, совершенно не хотим.

  Ответить  
 
 автор: uvajs   (21.11.2010 в 17:09)   письмо автору
 
   для: Trianon   (21.11.2010 в 16:15)
 

>Почему Вы считаете себя вправе грузить на рассмотрение код, в котором не расставлены отступы согласно вложенным составным операторам?
>Вы полагаете, что расставлять их за Вас приятное и веселое занятие?
>Почему первой исполняемой строкой скрипта не стоит error_reporting(E_ALL); ?
>Вы возможно уже настолько опытны, что предупреждений php Вам видеть не нужно.
>Мы же тут все сплошь новички, и догадываться о том, что нехорошего тихо происходит у Вас в коде, совершенно не хотим.
Знаете, я думал этот форум создан, чтобы помогать новичкам, видимо ошибался.
Спасибо всем, кто помог. мой вопрос закрыт.

  Ответить  
 
 автор: Евгений Т.   (22.11.2010 в 20:46)   письмо автору
 
   для: Trianon   (21.11.2010 в 16:15)
 

Учитесь прощать другим их ошибки.
Каждый когда-то был новичком. Поэтому когда кто-то допускает ошибку - будь это опечатка в слове, неосторожный флейм, глупый вопрос или неоправданно длинный ответ - будьте к этому снисходительны. Даже если руки чешутся ответить, подумайте дважды.
Если Вы обладаете хорошими манерами, это еще не значит, что Вы имеете лицензию на преподавание этих манер всем остальным. Если же Вы решили обратить внимание пользователя на его/ее ошибку, сделайте это корректно и лучше не в конференции, а в частном письме. Дайте людям возможность посомневаться. И не будьте высокомерным и надменным. Как известно, исправления в тексте часто тоже содержат грамматические ошибки; также и указание на несоблюдение правил, бывает, демонстрирует нарушение этого же форума.

  Ответить  
 
 автор: Trianon   (22.11.2010 в 23:54)   письмо автору
 
   для: Евгений Т.   (22.11.2010 в 20:46)
 

Почему же Вы сами не последовали собственному совету?

Затевать здесь дискуссию по указанным Вами моментам было бы жестким оффтопиком вкупе с явным нарушением правил.

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

  Ответить  
 
 автор: kosta_in_net   (26.11.2010 в 20:45)   письмо автору
 
   для: Лена   (07.10.2008 в 16:37)
 

если я правильно понял задачу: создать поисковую систему по файлам своего сайта, учитывающую словоформы, то я бы сделал так (хотя поиск по файлам - это геморой, лечше все делать в базе):

//... тут цикл по массиву с адресами файлов

$data=strip_tags(file_get_contents($filename));
preg_match_all ("/искомое/", $data, $matches);
$ar[$filename]=sizeof(@$matches[0]) ;


после этого массив сортируется по значениям и с одного его конца в ключах оказываются адреса (имена файлов) наиболее релевантных страниц, а сдругого - наименее.

Перед началом поиска само искомое, конечно, можно пропустить через stemmer. А для нескольких слов (при необходимости поиска по многословному запросу), вообще, сначала в массив, элементы массива на обработку, потом из массива:

$stemmer = new Lingua_Stem_Ru();
$string='искомое';
$data=preg_split("/[\s,\.!\?\:]+/",$string,-1,PREG_SPLIT_NO_EMPTY);
$i=sizeof($data);
for($i;$i>=0;$i--){
    $data[$i]=$stemmer->stem_word($data[$i]);
}
$string=implode(" ", $data);

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

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