За последние 24 часа нас посетили 55059 программистов и 1749 роботов. Сейчас ищут 788 программистов ...

Почему поиск строки постоянно дает фолс

Тема в разделе "Прочие вопросы по PHP", создана пользователем False_True, 21 окт 2015.

  1. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    Код (PHP):
    1. <?php
    2. $start_load = simplexml_load_file($_POST["load_name"], NULL, TRUE);
    3. $it_title=$start_load->channel->item->title;
    4. $it_link=$start_load->channel->item->link;
    5. $it_desc=$start_load->channel->item->description;
    6. $it_text=$start_load->channel->item->fulltext;
    7. $it_image=$start_load->channel->item->image;
    8. $it_cat=$start_load->channel->item->category;
    9.  
    10. $filename="check.txt";
    11. $find_l=file_get_contents($filename);
    12. echo $find_l;
    13. $get_title=$it_title;
    14.     if(stristr($find_l, $get_title)===true)
    15. {
    16.     file_put_contents($filename, "\n", FILE_APPEND);
    17.     file_put_contents($filename, $get_title, FILE_APPEND);
    18.     require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );
    19.     $posts = array(
    20.     'comment_status' => 'open',
    21.     'post_content' => $it_text,
    22.     'post_excerpt' => $it_desc,
    23.     'post_category' => array ($_POST["cat_id"]),
    24.     'post_status' => 'publish',
    25.     'post_title' => $it_title,
    26.     'post_type' => 'post'
    27.         );
    28.     $id_post=wp_insert_post( $posts );
    29. }
    30. else
    31. {
    32.     echo "DUDE!";
    33. }
    волнует именно почему эта часть дает фалс на постой

    Код (PHP):
    1. if(stristr($find_l, $get_title)===true)
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    зачем так делать?

    Лучше так:
    Код (PHP):
    1. if(stristr($find_l, $get_title)) 
    Добавлено спустя 6 минут 53 секунды:http://php.net/manual/ru/function.stristr
     
  3. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Потому что эта функция никогда не возвращает true. Читаем доку:
    Код (Text):
    1. Возвращает указанную подстроку. Если подстрока needle не найдена, возвращается FALSE.
    Если ты хотел написать условие "подстрока найдена", вот так будет вернее:
    Код (PHP):
    1. if (stristr($find_l, $get_title) !== false)
    Это не то же самое, что было у тебя. Почему — разберись сам. Напиши для себя простенькие тесты как работают операторы сравнения. Так запомнится наверняка.
     
  4. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Для текстов побольше, по-моему, функция strpos побыстрее будет, ведь она возвращает число, а не строку.
     
  5. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    Попробуй подебажить, изначально я сравнивал с фальс и даже когда в файле было несколько строк таких как искомая он всеровно давал фальс.

    Для текстовых файлов с неизвестным размером она имхо не катит по скорости.
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Давно продебажил, у меня подобных мест вагон ))) Теперь твоя очередь, бро. Иметь собственное мнение хорошо, когда оно чем-то подкреплено.

    Тут действительно strpos() как-то лучше смотрится, хотя сути не меняет.
     
  7. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Код (PHP):
    1. $str = "string string string int i i i ";
    2. $res = stristr($str, 'int');
    3. if ($res !== false) {
    4.     echo $res;
    5. }
    6. //вывод: int i i i  
     
  8. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    Не пари в облаках чувак, твои замечания слишком поверхностные чтобы быть каким то мнением.

    ты ее не дебажил 100%. Если дебажил то хоть скажи что эта программа должна делать.

    Я с пхп только знакомлюсь, но на с++ пишу уже давно, слишком тупо пихать стрпос в файл размера которого ты не знаешь а считать должен весь. Почитай чуток кодекс и удали процентов 95% своей самоуверенности.
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Дурака в игнор-лист!
     
  10. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Сначала ищется первое совпадение с первым символом искомой строки. Потом, если найдено, проверяется второй символ, и т.д. Если найдено полное совпадение, то функция завершает работу и возвращает номер позиции. Это очень быстрая операция.
    А вот функция str(i)str не только ищет совпадение, но и возвращает строку (выделяет память, делает копию..) от найденного места до конца строки.
    Так что
     
  11. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    Параметр, before_needle.
    Если установлен в TRUE, stristr() возвращает часть строки haystack до первого вхождения needle (не включая needle).

    Этот параметр можно не указывать и вышеизложенный прототип выполнятся не будет.
     
  12. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    И от этого как-то легче на сердце?
     
  13. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    Этот спор вообще не решает проблему, какой бы алгоритм поиска не применялся всеровно в файл дописывается строка не смотря на то что она уже есть в файле.

    Код (PHP):
    1. if(strpos($find_l, $get_title)===false)
    2. {
    3.     file_put_contents($filename, "\n", FILE_APPEND);
    4.     file_put_contents($filename, $get_title, FILE_APPEND); 
     
  14. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    False_True, показал бы весь код, а то не понятно что пытаешься делать.
     
  15. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    Я в первом сообщении весь код показал. Пусть будет с стрпос если вам проще от этого

    Код (PHP):
    1. <?php
    2. $start_load = simplexml_load_file($_POST["load_name"], NULL, TRUE);
    3. $it_title=$start_load->channel->item->title;
    4. $it_link=$start_load->channel->item->link;
    5. $it_desc=$start_load->channel->item->description;
    6. $it_text=$start_load->channel->item->fulltext;
    7. $it_image=$start_load->channel->item->image;
    8. $it_cat=$start_load->channel->item->category;
    9.  
    10. $filename="check.txt";
    11. $find_l=file_get_contents($filename);
    12. echo $find_l;
    13. $get_title=$it_title;
    14.     if(strpos($find_l, $get_title)===false)
    15. {
    16.     file_put_contents($filename, "\n", FILE_APPEND);
    17.     file_put_contents($filename, $get_title, FILE_APPEND);
    18.     require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );
    19.     $posts = array(
    20.     'comment_status' => 'open',
    21.     'post_content' => $it_text,
    22.     'post_excerpt' => $it_desc,
    23.     'post_category' => array ($_POST["cat_id"]),
    24.     'post_status' => 'publish',
    25.     'post_title' => $it_title,
    26.     'post_type' => 'post'
    27.         );
    28.     $id_post=wp_insert_post( $posts );
    29. }
    30. else
    31. {
    32.     echo "DUDE!";
    33. }
    34.  
    35.  
    файл выглядит так [​IMG]

    Суть, сделать защиту от повторного парсинга статьи, то есть я пишу в файл тайтл статьи и след раз когда крон запускает скрипт он проверяет на наличие тайтла в файле а потом скрипт принимает решение публиковать и записать или пропустить.
     
  16. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
  17. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    У меня условие стоит на строка не найдена и оно правильное, если нет тыкни носом.
     
  18. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Код (Text):
    1. if(strpos($find_l, $get_title)===false)
    После этого условия код будет выполнен только если не найдено ничего (как и у функции str(i)str). Ты этого хочешь?

    Выложи где-нибудь XML, который читаешь.
     
  19. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    этого и хочу, но вопреки этому всегда ничего не находит. Я это пишу где-то раз 3 или 4 на этом форуме... Это вообще суть того что мне нужно, фид роли не играет, я с разных источников их беру. главное рсс 2.0
     
  20. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Ну трудно что ли выложить? Нужно искать этот "главное pcc 2.0".
     
  21. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    пардон, http: // k.img.com.ua/rss/ru/events. xml
     
  22. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Решение найдено!
    Замени strpos на mb_strpos
     
  23. False_True

    False_True Новичок

    С нами с:
    7 сен 2015
    Сообщения:
    37
    Симпатии:
    0
    Большое спасибо, если не трудно можешь пояснить почему именно так?
     
  24. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    $get_title и $it_title взяты из simplexml, у них тип не строковый. Можно это проверить так
    Код (PHP):
    1. var_dump($find_l);
    2. var_dump($get_title);
    Может быть, поэтому. strpos проверяет побайтно, потому не находит ничего, а mb_strpos сначала приводит к строковому типу.

    можно так
    Код (PHP):
    1. if(strpos($find_l, (string)$get_title) === false)
     
  25. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    нашему герою надо идти туда, куда он других шлёт: в дебаг! ))) опытный наш!
    http://phpfaq.ru/debug