За последние 24 часа нас посетили 22783 программиста и 1561 робот. Сейчас ищет 901 программист ...

поиск

Тема в разделе "Прочие вопросы по PHP", создана пользователем zhenia3003, 24 авг 2014.

  1. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    как сделать чтобы данный поиск искал без учета регистра и по совпадению хотя бы одного слова из строки?
    Код (Text):
    1.  
    2. if(isset($_POST['otprav'])){
    3. $words1 = file("$key/title.txt");
    4. $pos = (in_array($_POST['poisk'], $words1));
    5. if ($pos) {
    6. echo "найдено";
    7. } else {
    8. //не нашли
    9. }
    10. }
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. if(isset($_POST['otprav'],$_POST['poisk'])) {
    2.     mb_internal_encoding('utf-8');
    3.     $file=file($key.'/title.txt');
    4.     $search=in_array(mb_strtolower($_POST['poisk']),array_map('mb_strtolower',$file));
    5.     if($search) { 
    6.         echo'найдено';
    7.     } else {
    8.         echo'не найдено';
    9.     }
    10. }
     
  3. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    Спасибо, работает, а если в файле строка из нескольких слов, как осуществить поиск?
     
  4. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    В этом действии - это не важно.
    Так как ключи массива могут содержать любые символы, как и значения.
    'word1 word2'=>'Word texts...'
    А функция file многострочно выводит.
    Массив строк.
    То есть строка может быть любая.

    Или еще лучше, вы, что - то, не договариваете! ;)
     
  5. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    у меня есть файл со строкой "продам", с помощью этого кода я ввожу слово в форме "продам" - он ищет, все ок! Но, если у меня строка "продам квартиру", я ввожу "продам", код ничего не находит! Как это исправить?
     
  6. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Тогда вам, совсем не это нужно.
    Воспользуйтесь регулярными выражениями.
    И покажите вы наконец эти строки хоть чучуть =)
    И объясните полный план поиска.
    " А то, надо - это, а потом скажу остальное, причем сразу. "
    Так не пойдет.

    Или, чтобы вам помочь, мне еще и строки нужно сочинять?))
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    может лучше в БД?
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Не лучше.
    Если у нее задача простенькая " слово продам ", стоит в начале всегда, то тут вообще пустяк будет, а вот если уже " продаю, продается, перепродам ", уже будет сложнее и если будет в разных местах и нужно только одно вхождение, становится сложно.
     
  9. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3

    Код (Text):
    1.  
    2. <form method="post">
    3. <input type="text" name="poisk">
    4. <input type="submit" name="otprav" value="Найти">
    5. </form>
    6.  
    7. foreach (glob("base/*") as $key) {
    8. if(isset($_POST['otprav'])) {
    9. $file=file($key.'/title.txt');
    10. $search=in_array(mb_strtolower($_POST['poisk']),array_map('mb_strtolower',$file));
    11. if($search) {
    12. echo "нашли";
    13. } else {
    14. }
    15. }
    16. }
    1. title.txt строка "продам"
    2. title.txt строка "продам квартиру"
    3. title.txt строка "перепродам квартиру"

    В форме ввожу "продам" - находит только 1-й title, хочу чтобы по слову "продам" находило все 3 шт title
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а откуда эти файлы вообще берутся?
     
  11. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    Они уже созданы, лежат в папки base
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    и новые не появятся?
     
  13. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    причем здесь появляются или нет? это ж не влияет на поиск.
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а вы ответьте =)
     
  15. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    добавляются, это уже другой код))
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    может тогда сформировать структуру какую-то еще на этапе добавления, которая поможет работать с этими файлами.

    а поиск у вас не работает потому что он не ищет в строке, а сравнивает член массива (всю строку) с предложенной вами.
     
  17. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    я понимаю что он все строку сравнивает, поэтому и прошу помочь)),
     
  18. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Хм, если не напрягаясь то так сделай =)))
    Код (PHP):
    1. $post='продам';
    2. $file='text.txt';
    3. $file=file($file);
    4. foreach($file as $value) {
    5.     $value=trim($value);
    6.     if(preg_match('/^'.$post.'/',$value)) {
    7.         echo $value.'<br>';
    8.     }
    9. }
    Код (Text):
    1. /*
    2.     продам
    3.     продам квартиру
    4. */
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну, можно предложить вам
    - разбить искомое на части
    - поискать по-отдельности
    - посчитать сколько раз какое слово было найдено
    - составить сводную таблицу по всем файлам
    - выбрать сначала те файлы, в которых найдены все искомые слова
    - вывести эти файлы по убыванию суммы найденых раз... =)

    Добавлено спустя 1 минуту 51 секунду:
    Короче, БД ждёт вас, Евгений Иванович.
     
  20. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Забыл добавить iu модификаторы. preg_match('/^'.$post.'/iu',$value)
    ^ - ищем в начале строки
    i - для регистронезависимости.
    u - для юникода, так как работаете с русским.
     
  21. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    у меня что то вообще не работает(((
    Код (Text):
    1.  
    2.  
    3.   if(isset($_POST['otprav'])) {
    4.  
    5. $file1=file('$key/title.txt');
    6. foreach($file1 as $value1) {
    7.     $value1=trim($value1);
    8.     if(preg_match('/^'.$_POST['poisk'].'/i',$value1)) {
    9.       echo "работает";
    10.     }
    11. }
    12.  
    13. }
    14.  
    Добавлено спустя 3 минуты 18 секунд:
    в данном коде есть foreach , у меня есть еще один foreach выше, может из-за этого?
     
  22. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Переменная $key в вашем случае не отработает.
    Код (PHP):
    1. $file1=file('$key/title.txt');
    А так, отработает:
    Код (PHP):
    1. $file1=file($key.'/title.txt');
    Или еще можно было бы сделать так:
    Код (PHP):
    1. $key.='/title.txt';
    2. $file1=file($key);
     
  23. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    все равно не работает, я думаю из-за forech
    Код (Text):
    1.  
    2. foreach (glob("base/*" as $key) {
    3. //СЮДА ВСТАВЛЯЮ КОД
    4. }
    Добавлено спустя 13 минут 18 секунд:
    вот так получилось file($key.'/title.txt'); , спасибо за ответы
     
  24. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Лучше вынеси glob из цикла foreach, чтобы не вызывать при каждой итерации цикла "снова и снова".
    Код (PHP):
    1. <?php
    2. if(isset($_POST['send'],$_POST['search'])) {
    3.     define('SLASH',DIRECTORY_SEPARATOR);
    4.     define('DIR',__DIR__.SLASH);
    5.     $base=DIR.'base'.SLASH;
    6.     if(is_dir($base)) {
    7.         $base=glob($base.'*.txt');
    8.         if($base) {
    9.             foreach($base as $baseValue) {
    10.                 $baseValue=file($baseValue);
    11.                 if($baseValue) {
    12.                     foreach($baseValue as $lineValue) {
    13.                         if($lineValue) {
    14.                             $lineValue=trim($lineValue);
    15.                             if(preg_match('/^'.preg_quote($_POST['search']).'/iu',$lineValue)) {
    16.                                 echo nl2br($lineValue.'
    17.                                 ');
    18.                             }
    19.                         }
    20.                     }
    21.                 }
    22.             }
    23.         }
    24.     }
    25.     unset($base);
    26. }
    27. ?>
    Код (PHP):
    1. <form method="post">
    2.     <input type="text" name="search">
    3.     <input type="submit" name="send" value="Найти">
    4. </form>
     
  25. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Пусть в $search находится строка, слова из которой надо искать.
    В $text находится текст. Возможно с символами \n, т.е. нормальный многострочный текст.

    Функция должна вернуть результат true если хотябы одно из слов найдено в тексте.

    Код (PHP):
    1. function find($search, $text)
    2. {
    3.     // теперь мы регистронезависимы!
    4.     $search = mb_strtolower($search);
    5.     $text = mb_strtolower($text);
    6.     // разбиваем на слова, пустые слова выкидываем
    7.     $words = array_filter(explode(' ', $search), 'strlen');
    8.     // тестируем слова до первого совпадения
    9.     foreach ($words as $word) {
    10.         if (strpos($text, $word) !== false) {
    11.             return true;
    12.         }
    13.     }
    14.     return false;
    15. }