Код (PHP): <?php $start_load = simplexml_load_file($_POST["load_name"], NULL, TRUE); $it_title=$start_load->channel->item->title; $it_link=$start_load->channel->item->link; $it_desc=$start_load->channel->item->description; $it_text=$start_load->channel->item->fulltext; $it_image=$start_load->channel->item->image; $it_cat=$start_load->channel->item->category; $filename="check.txt"; $find_l=file_get_contents($filename); echo $find_l; $get_title=$it_title; if(stristr($find_l, $get_title)===true) { file_put_contents($filename, "\n", FILE_APPEND); file_put_contents($filename, $get_title, FILE_APPEND); require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' ); $posts = array( 'comment_status' => 'open', 'post_content' => $it_text, 'post_excerpt' => $it_desc, 'post_category' => array ($_POST["cat_id"]), 'post_status' => 'publish', 'post_title' => $it_title, 'post_type' => 'post' ); $id_post=wp_insert_post( $posts ); } else { echo "DUDE!"; } волнует именно почему эта часть дает фалс на постой Код (PHP): if(stristr($find_l, $get_title)===true)
зачем так делать? Лучше так: Код (PHP): if(stristr($find_l, $get_title)) Добавлено спустя 6 минут 53 секунды:http://php.net/manual/ru/function.stristr
Потому что эта функция никогда не возвращает true. Читаем доку: Код (Text): Возвращает указанную подстроку. Если подстрока needle не найдена, возвращается FALSE. Если ты хотел написать условие "подстрока найдена", вот так будет вернее: Код (PHP): if (stristr($find_l, $get_title) !== false) Это не то же самое, что было у тебя. Почему — разберись сам. Напиши для себя простенькие тесты как работают операторы сравнения. Так запомнится наверняка.
Для текстов побольше, по-моему, функция strpos побыстрее будет, ведь она возвращает число, а не строку.
Попробуй подебажить, изначально я сравнивал с фальс и даже когда в файле было несколько строк таких как искомая он всеровно давал фальс. Для текстовых файлов с неизвестным размером она имхо не катит по скорости.
Давно продебажил, у меня подобных мест вагон ))) Теперь твоя очередь, бро. Иметь собственное мнение хорошо, когда оно чем-то подкреплено. Тут действительно strpos() как-то лучше смотрится, хотя сути не меняет.
Код (PHP): $str = "string string string int i i i "; $res = stristr($str, 'int'); if ($res !== false) { echo $res; } //вывод: int i i i
Не пари в облаках чувак, твои замечания слишком поверхностные чтобы быть каким то мнением. ты ее не дебажил 100%. Если дебажил то хоть скажи что эта программа должна делать. Я с пхп только знакомлюсь, но на с++ пишу уже давно, слишком тупо пихать стрпос в файл размера которого ты не знаешь а считать должен весь. Почитай чуток кодекс и удали процентов 95% своей самоуверенности.
Сначала ищется первое совпадение с первым символом искомой строки. Потом, если найдено, проверяется второй символ, и т.д. Если найдено полное совпадение, то функция завершает работу и возвращает номер позиции. Это очень быстрая операция. А вот функция str(i)str не только ищет совпадение, но и возвращает строку (выделяет память, делает копию..) от найденного места до конца строки. Так что
Параметр, before_needle. Если установлен в TRUE, stristr() возвращает часть строки haystack до первого вхождения needle (не включая needle). Этот параметр можно не указывать и вышеизложенный прототип выполнятся не будет.
Этот спор вообще не решает проблему, какой бы алгоритм поиска не применялся всеровно в файл дописывается строка не смотря на то что она уже есть в файле. Код (PHP): if(strpos($find_l, $get_title)===false) { file_put_contents($filename, "\n", FILE_APPEND); file_put_contents($filename, $get_title, FILE_APPEND);
Я в первом сообщении весь код показал. Пусть будет с стрпос если вам проще от этого Код (PHP): <?php $start_load = simplexml_load_file($_POST["load_name"], NULL, TRUE); $it_title=$start_load->channel->item->title; $it_link=$start_load->channel->item->link; $it_desc=$start_load->channel->item->description; $it_text=$start_load->channel->item->fulltext; $it_image=$start_load->channel->item->image; $it_cat=$start_load->channel->item->category; $filename="check.txt"; $find_l=file_get_contents($filename); echo $find_l; $get_title=$it_title; if(strpos($find_l, $get_title)===false) { file_put_contents($filename, "\n", FILE_APPEND); file_put_contents($filename, $get_title, FILE_APPEND); require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' ); $posts = array( 'comment_status' => 'open', 'post_content' => $it_text, 'post_excerpt' => $it_desc, 'post_category' => array ($_POST["cat_id"]), 'post_status' => 'publish', 'post_title' => $it_title, 'post_type' => 'post' ); $id_post=wp_insert_post( $posts ); } else { echo "DUDE!"; } файл выглядит так Суть, сделать защиту от повторного парсинга статьи, то есть я пишу в файл тайтл статьи и след раз когда крон запускает скрипт он проверяет на наличие тайтла в файле а потом скрипт принимает решение публиковать и записать или пропустить.
False_True, тебе же artoodetoo всё объяснил и показал в посте viewtopic.php?f=2&t=55101&p=440854#p440775 Повторять написанное нет смысла.
Код (Text): if(strpos($find_l, $get_title)===false) После этого условия код будет выполнен только если не найдено ничего (как и у функции str(i)str). Ты этого хочешь? Выложи где-нибудь XML, который читаешь.
этого и хочу, но вопреки этому всегда ничего не находит. Я это пишу где-то раз 3 или 4 на этом форуме... Это вообще суть того что мне нужно, фид роли не играет, я с разных источников их беру. главное рсс 2.0
$get_title и $it_title взяты из simplexml, у них тип не строковый. Можно это проверить так Код (PHP): var_dump($find_l); var_dump($get_title); Может быть, поэтому. strpos проверяет побайтно, потому не находит ничего, а mb_strpos сначала приводит к строковому типу. можно так Код (PHP): if(strpos($find_l, (string)$get_title) === false)