|
|
|
|
<?php
$text = "Получить контент другого сайта средствами PHP очень просто.
Для этого существует ряд полезных функций, которые можно смело задействовать для этих
целей. Самый простой вариант - получение контента при помощи функции file_get_contents.
Достаточно передать URL в качестве параметра этой функции и она вернет полученный контент
или false - в случае неудачи. Но мы легких путей не ищем, поэтому дальше рассмотрим более
сложную функцию, обладающую рядом дополнительных и полезных качеств. ";
$word = "контент";
preg_match_all ("#(\S+\s+){1,10}" . $word . "(\s+\S+){1,10}#is", $text, $out, PREG_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>';
}
?>
|
Как сделать так, чтобы находило не только слово "контент", а и производные от него, с одинаковым корнем: контента, контенту, контентный? | |
|
|
|
|
|
|
|
для: Лена
(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. И почему бы разработчикам форума не устранить баг? | |
|
|
|
|
|
|
|
для: BinLaden
(07.10.2008 в 17:18)
| | Перехожу по Вашей ссылке - пишет "Темы, которую вы запросили, не существует" | |
|
|
|
|
|
|
|
для: Лена
(07.10.2008 в 17:26)
| | Нужно убрать из ссылки пробел. Это форум распотрошил URL. Вот альтернативный линк: http://forum.dklab.ru/viewtopic.php?t=14279 | |
|
|
|
|
|
|
|
для: BinLaden
(07.10.2008 в 17:31)
| | Спасибо. Буду разбираться. Но вы все-таки загляните в эту тему еще завтра. | |
|
|
|
|
 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 - все не слова, а зачем еще один обратный слеш? Фридла я сейчас читаю, но наверное, до этого места еще не дочитала. | |
|
|
|
|
|
|
|
для: Лена
(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. Когда Вы пишите
, то будет выведено просто "\S".
Хотя, конечно, допускается и обычная запись
, которая тоже выведет "\S", так как для парсера PHP такая последовательность неизвестна. | |
|
|
|
|
 4.5 Кб |
|
|
для: BinLaden
(08.10.2008 в 12:35)
| | Не получается применить стеммер внутри скрипта. Коротко, что я делаю. Читаю каждый файл определенной директории, ищу слово, если слово есть, считается, сколько раз встречается слово в файле и выводится ссылка на статью, в которой слово найдено.
Ссылки выводятся в зависимости от релевантности слова. От большего - к меньшему.
Дальше каждая ссылка открывается - читается файл, все найденные слова и их словоформы подсвечиваются.
Проблема в том, что стеммер работает только тогда, когда ссылки уже открываются.
В самом же начале, когда я выясняю, есть ли в файле данное слово, его словоформы не находятся - я не знаю, как здесь стеммер подключить (это строка 39). Поэтому дальше, когда я проверяю существование ключа в массиве - стр. 42 if(array_key_exists($word, $count)){ - проверяется существование слова, но не его словоформ.
Как в строке 42 вместо $word впихнуть массив совпадений, который получается в результате работы стеммера? | |
|
|
|
|
|
|
|
для: BinLaden
(08.10.2008 в 12:35)
| | Посоветовал отказаться от стеммера и в примере его сам использовал :)) | |
|
|
|
|
|
|
|
для: BinLaden
(09.10.2008 в 15:45)
| | Чтобы загладить свою вину, вам нужно внимательно прочитать мой предыдущий пост.
Проблема не решена.
Первоначально в файлах ищется слово, а не его словоформы. Как здесь подключить стеммер? Не буду я от него отказываться, если что-то сама придумаю, сообщу | |
|
|
|
|
|
|
|
для: Лена
(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 ){
# ...
}
}
# ...
?>
|
| |
|
|
|
|
 5.4 Кб |
|
|
для: BinLaden
(09.10.2008 в 16:37)
| | Получилось. Прикрепила файл. Если что-то неправильно, поправьте.
Не получилось одно.
Строка 53 - здесь у меня $all_value считает, сколько слов найдено в одном файле. У меня предыдущее значение почему-то не приплюсовывается к настоящему числу. Мне это важно, потому что дальше я сортирую полученный массив по убыванию. Можете мне помочь? | |
|
|
|
|
|
|
|
для: Лена
(10.10.2008 в 10:03)
| | Всё-таки сделали по-своему...
> Строка 53 - здесь у меня $all_value считает, сколько слов найдено в одном файле. У меня предыдущее значение почему-то не приплюсовывается к настоящему числу. Мне это важно, потому что дальше я сортирую полученный массив по убыванию. Можете мне помочь?
Просто замените этот кусок кода:
<?php
//с помощью стеммера находим все формы слова внутри файла
preg_match_all('/' . preg_quote($stemmer->stem_word($word), '/') . '\\S*/i',$r, $out, PREG_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);
?>
|
| |
|
|
|
|
|
|
|
для: 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);
|
учесть, что если слово повторяется, то забрать в массив все его повторы? У вас же опыта и
знаний раз в десять больше, чем у меня, помогите, пожалуйста. | |
|
|
|
|
|
|
|
для: Лена
(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() возвращает кол-во совпадений -- это Вам и нужно, насколько я понял. | |
|
|
|
|
|
|
|
для: BinLaden
(10.10.2008 в 17:34)
| | Пожалуйста, кто нибудь выложите рабочий скрипт, а то не понятно о чем Вы говорите | |
|
|
|
|
|
|
|
для: uvajs
(14.11.2010 в 12:33)
| | Лена Вы мне поможете??? | |
|
|
|
|
|
|
|
для: uvajs
(14.11.2010 в 13:07)
| | Помогите разобраться хоть кто нибудь, очень помощь нужна | |
|
|
|
|
|
|
|
для: uvajs
(14.11.2010 в 13:07)
| | >Лена Вы мне поможете???
Помогу, если позволит время.
Помогу, если покажете свой скрипт - тот, который есть на данный момент.
Помогу, если внятно объясните, что вам на самом деле нужно.
Помогу, но писать за вас не буду. | |
|
|
|
|
|
|
|
для: Лена
(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) > 0 )
{
$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>
<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
(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
(20.11.2010 в 21:13)
| | _ | |
|
|
|
|
|
|
|
для: 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) > 0 ) //К ЧЕМУ ЗДЕСЬ @? ДЛЯ ЧЕГО СЛУЖИТ ЭТОТ СИМВОЛ?
{
$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>
<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>
|
По основной проблеме.
Я - пользователь. Вбила в форму слово "урок" - мне надо найти все фразы, в которых есть это слово + фразы, где есть "урока, уроков".
Я нажала на кнопку. Дальше начинает работать скрипт, который вы написали. Скрипт будет искать все эти слова в базе или в файлах?
Если в базе - в каких полях базы должен производиться поиск?
Если в файлах - что содержится в этих файлах? | |
|
|
|
|
|
|
|
для: Лена
(21.11.2010 в 00:14)
| | >//tags.tag НЕ ДОЛЖНО ВЫТЯГИВАТЬСЯ В ГРУППИРУЮЩЕМ ЗАПРОСЕ
Теги выводятся нормально.
> //ЗАЧЕМ ЗДЕСЬ <li> </li>? ЛУЧШЕ ЭТИ ТЕГИ ПЕРЕНЕСТИ В МЕСТО НЕПОСРЕДСТВЕННОГО ВЫВОДА ОШИБКИ
Я сначала заношу ошибки в переменную: $log, потом если же есть ошибки в нижу есть вывод.
>//ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ stripslashes. ЗАЧЕМ ВЫ ЕЕ ИСПОЛЬЗУЕТЕ?
Чтобы убрать кавычки ("").
>//ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ htmlspecialchars. ЕСТЬ ЛИ СМЫСЛ ЕЕ ЗДЕСЬ ИСПОЛЬЗОВАТЬ?
Чтобы заменить <> на такие мнимоники <>
>//ГДЕ В ЗАПРОСЕ ЗАЩИТА ОТ SQL-ИНЪЕКЦИЙ?
Писать защищенные запросы я пока не умею так, как еще слаб в PHP.
>//ЭТО ЗАЧЕМ? ВЫ ЕГО ГДЕ-ТО ПОТОМ ИСПОЛЬЗУЕТЕ?
Если есть ошибки, заношу их в массив в переменную $log...
>Я - пользователь. Вбила в форму слово "урок" - мне надо найти все фразы, в которых есть это слово + фразы, где есть "урока, уроков".
Я нажала на кнопку. Дальше начинает работать скрипт, который вы написали.
Да все Правильно!
>Скрипт будет искать все эти слова в базе или в файлах?
Да, в поле TEXT | |
|
|
|
|
|
|
|
для: uvajs
(21.11.2010 в 09:17)
| | >>//tags.tag НЕ ДОЛЖНО ВЫТЯГИВАТЬСЯ В ГРУППИРУЮЩЕМ ЗАПРОСЕ
>Теги выводятся нормально.
Ответ неверный. Мне (как и Лене) не интересно, как они выводятся.
Мне интересно, чтобы в исходном тексте не было кода, афтор которого не понимает, как он работает.
А этот код помимо всего прочего, еще и формально некорректный.
>> //ЗАЧЕМ ЗДЕСЬ <li> </li>? ЛУЧШЕ ЭТИ ТЕГИ ПЕРЕНЕСТИ В МЕСТО НЕПОСРЕДСТВЕННОГО ВЫВОДА ОШИБКИ
>Я сначала заношу ошибки в переменную: $log, потом если же есть ошибки в нижу есть вывод.
Ответ неверный. <li></li> сами по себе об шибках не говорят ничего. Заносить их не требуется.
.
>>//ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ stripslashes. ЗАЧЕМ ВЫ ЕЕ ИСПОЛЬЗУЕТЕ?
>Чтобы убрать кавычки ("").
Ответ неверный. Эта функция никакие кавычки не убирает. Кстати, зачем Вам убирать кавычки? Чем они Вам не угодили в сравнении с другими буквами, знаками, цифрами?
>>//ОБЪЯСНИТЕ, ЧТО ДЕЛАЕТ htmlspecialchars. ЕСТЬ ЛИ СМЫСЛ ЕЕ ЗДЕСЬ ИСПОЛЬЗОВАТЬ?
>Чтобы заменить <> на такие мнимоники <>
Что еще за мнемоники? кому они улучшают память?
Зачем менять символы на мнемоники? Чем символы плохи?
>>//ГДЕ В ЗАПРОСЕ ЗАЩИТА ОТ SQL-ИНЪЕКЦИЙ?
>Писать защищенные запросы я пока не умею так, как еще слаб в PHP.
Писать Вы никакие запросы не умеете, однако ж пытаетесь.
>>//ЭТО ЗАЧЕМ? ВЫ ЕГО ГДЕ-ТО ПОТОМ ИСПОЛЬЗУЕТЕ?
>Если есть ошибки, заношу их в массив в переменную $log...
>>Я - пользователь. Вбила в форму слово "урок" - мне надо найти все фразы, в которых есть это слово + фразы, где есть "урока, уроков".
>Я нажала на кнопку. Дальше начинает работать скрипт, который вы написали.
>Да все Правильно!
>
>>Скрипт будет искать все эти слова в базе или в файлах?
>Да, в поле TEXT
Ответ неверный.
В базе или в файле?
ни у базы, ни у файлов полей нет!
У меня к Вам отдельная порция вопросвов.
Почему Вы считаете себя вправе грузить на рассмотрение код, в котором не расставлены отступы согласно вложенным составным операторам?
Вы полагаете, что расставлять их за Вас приятное и веселое занятие?
Почему первой исполняемой строкой скрипта не стоит error_reporting(E_ALL); ?
Вы возможно уже настолько опытны, что предупреждений php Вам видеть не нужно.
Мы же тут все сплошь новички, и догадываться о том, что нехорошего тихо происходит у Вас в коде, совершенно не хотим. | |
|
|
|
|
|
|
|
для: Trianon
(21.11.2010 в 16:15)
| | >Почему Вы считаете себя вправе грузить на рассмотрение код, в котором не расставлены отступы согласно вложенным составным операторам?
>Вы полагаете, что расставлять их за Вас приятное и веселое занятие?
>Почему первой исполняемой строкой скрипта не стоит error_reporting(E_ALL); ?
>Вы возможно уже настолько опытны, что предупреждений php Вам видеть не нужно.
>Мы же тут все сплошь новички, и догадываться о том, что нехорошего тихо происходит у Вас в коде, совершенно не хотим.
Знаете, я думал этот форум создан, чтобы помогать новичкам, видимо ошибался.
Спасибо всем, кто помог. мой вопрос закрыт. | |
|
|
|
|
|
|
|
для: Trianon
(21.11.2010 в 16:15)
| | Учитесь прощать другим их ошибки.
Каждый когда-то был новичком. Поэтому когда кто-то допускает ошибку - будь это опечатка в слове, неосторожный флейм, глупый вопрос или неоправданно длинный ответ - будьте к этому снисходительны. Даже если руки чешутся ответить, подумайте дважды.
Если Вы обладаете хорошими манерами, это еще не значит, что Вы имеете лицензию на преподавание этих манер всем остальным. Если же Вы решили обратить внимание пользователя на его/ее ошибку, сделайте это корректно и лучше не в конференции, а в частном письме. Дайте людям возможность посомневаться. И не будьте высокомерным и надменным. Как известно, исправления в тексте часто тоже содержат грамматические ошибки; также и указание на несоблюдение правил, бывает, демонстрирует нарушение этого же форума. | |
|
|
|
|
|
|
|
для: Евгений Т.
(22.11.2010 в 20:46)
| | Почему же Вы сами не последовали собственному совету?
Затевать здесь дискуссию по указанным Вами моментам было бы жестким оффтопиком вкупе с явным нарушением правил.
Ответить Вам приватным письмом возможнолсти не представляется по той же причине, что и автору вопроса.
Вы не указали е-мэйл в профиле, а значит ни письмо автору реплики написать, ни ответить на его личное сообщение не получится.
Так что если хотите подкрепить свои доводы аргументами, сперва заполните профиль. | |
|
|
|
|
|
|
|
для: Лена
(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);
|
| |
|
|
|
|