как сделать чтобы данный поиск искал без учета регистра и по совпадению хотя бы одного слова из строки? Код (Text): if(isset($_POST['otprav'])){ $words1 = file("$key/title.txt"); $pos = (in_array($_POST['poisk'], $words1)); if ($pos) { echo "найдено"; } else { //не нашли } }
Код (PHP): if(isset($_POST['otprav'],$_POST['poisk'])) { mb_internal_encoding('utf-8'); $file=file($key.'/title.txt'); $search=in_array(mb_strtolower($_POST['poisk']),array_map('mb_strtolower',$file)); if($search) { echo'найдено'; } else { echo'не найдено'; } }
В этом действии - это не важно. Так как ключи массива могут содержать любые символы, как и значения. 'word1 word2'=>'Word texts...' А функция file многострочно выводит. Массив строк. То есть строка может быть любая. Или еще лучше, вы, что - то, не договариваете!
у меня есть файл со строкой "продам", с помощью этого кода я ввожу слово в форме "продам" - он ищет, все ок! Но, если у меня строка "продам квартиру", я ввожу "продам", код ничего не находит! Как это исправить?
Тогда вам, совсем не это нужно. Воспользуйтесь регулярными выражениями. И покажите вы наконец эти строки хоть чучуть =) И объясните полный план поиска. " А то, надо - это, а потом скажу остальное, причем сразу. " Так не пойдет. Или, чтобы вам помочь, мне еще и строки нужно сочинять?))
Не лучше. Если у нее задача простенькая " слово продам ", стоит в начале всегда, то тут вообще пустяк будет, а вот если уже " продаю, продается, перепродам ", уже будет сложнее и если будет в разных местах и нужно только одно вхождение, становится сложно.
Код (Text): <form method="post"> <input type="text" name="poisk"> <input type="submit" name="otprav" value="Найти"> </form> foreach (glob("base/*") as $key) { if(isset($_POST['otprav'])) { $file=file($key.'/title.txt'); $search=in_array(mb_strtolower($_POST['poisk']),array_map('mb_strtolower',$file)); if($search) { echo "нашли"; } else { } } } 1. title.txt строка "продам" 2. title.txt строка "продам квартиру" 3. title.txt строка "перепродам квартиру" В форме ввожу "продам" - находит только 1-й title, хочу чтобы по слову "продам" находило все 3 шт title
может тогда сформировать структуру какую-то еще на этапе добавления, которая поможет работать с этими файлами. а поиск у вас не работает потому что он не ищет в строке, а сравнивает член массива (всю строку) с предложенной вами.
Хм, если не напрягаясь то так сделай =))) Код (PHP): $post='продам'; $file='text.txt'; $file=file($file); foreach($file as $value) { $value=trim($value); if(preg_match('/^'.$post.'/',$value)) { echo $value.'<br>'; } } Код (Text): /* продам продам квартиру */
ну, можно предложить вам - разбить искомое на части - поискать по-отдельности - посчитать сколько раз какое слово было найдено - составить сводную таблицу по всем файлам - выбрать сначала те файлы, в которых найдены все искомые слова - вывести эти файлы по убыванию суммы найденых раз... =) Добавлено спустя 1 минуту 51 секунду: Короче, БД ждёт вас, Евгений Иванович.
Забыл добавить iu модификаторы. preg_match('/^'.$post.'/iu',$value) ^ - ищем в начале строки i - для регистронезависимости. u - для юникода, так как работаете с русским.
у меня что то вообще не работает((( Код (Text): if(isset($_POST['otprav'])) { $file1=file('$key/title.txt'); foreach($file1 as $value1) { $value1=trim($value1); if(preg_match('/^'.$_POST['poisk'].'/i',$value1)) { echo "работает"; } } } Добавлено спустя 3 минуты 18 секунд: в данном коде есть foreach , у меня есть еще один foreach выше, может из-за этого?
Переменная $key в вашем случае не отработает. Код (PHP): $file1=file('$key/title.txt'); А так, отработает: Код (PHP): $file1=file($key.'/title.txt'); Или еще можно было бы сделать так: Код (PHP): $key.='/title.txt'; $file1=file($key);
все равно не работает, я думаю из-за forech Код (Text): foreach (glob("base/*" as $key) { //СЮДА ВСТАВЛЯЮ КОД } Добавлено спустя 13 минут 18 секунд: вот так получилось file($key.'/title.txt'); , спасибо за ответы
Лучше вынеси glob из цикла foreach, чтобы не вызывать при каждой итерации цикла "снова и снова". Код (PHP): <?php if(isset($_POST['send'],$_POST['search'])) { define('SLASH',DIRECTORY_SEPARATOR); define('DIR',__DIR__.SLASH); $base=DIR.'base'.SLASH; if(is_dir($base)) { $base=glob($base.'*.txt'); if($base) { foreach($base as $baseValue) { $baseValue=file($baseValue); if($baseValue) { foreach($baseValue as $lineValue) { if($lineValue) { $lineValue=trim($lineValue); if(preg_match('/^'.preg_quote($_POST['search']).'/iu',$lineValue)) { echo nl2br($lineValue.' '); } } } } } } } unset($base); } ?> Код (PHP): <form method="post"> <input type="text" name="search"> <input type="submit" name="send" value="Найти"> </form>
Пусть в $search находится строка, слова из которой надо искать. В $text находится текст. Возможно с символами \n, т.е. нормальный многострочный текст. Функция должна вернуть результат true если хотябы одно из слов найдено в тексте. Код (PHP): function find($search, $text) { // теперь мы регистронезависимы! $search = mb_strtolower($search); $text = mb_strtolower($text); // разбиваем на слова, пустые слова выкидываем $words = array_filter(explode(' ', $search), 'strlen'); // тестируем слова до первого совпадения foreach ($words as $word) { if (strpos($text, $word) !== false) { return true; } } return false; }