PHP сравнивает заголовки с другим заголовком

Я работаю над функцией, которая сравнивает заголовок сообщения со списком заголовков (продуктов на моем веб-сайте).

Он предназначен для создания простой рекламной системы на моих собственных веб-сайтах, которая отслеживает заголовок текущего поста и сравнивает его с названиями продуктов на моем веб-сайте.

Если он находит совпадение, система должна вырезать строку заголовка продукта из заголовка сообщения и удалить все остальное.

Пример:

Текущее название: Совершенно новый горный велосипед!

Список названий:

  1. Холодильник
  2. Стол
  3. Горный велосипед
  4. Книга
  5. Ноутбук

Итак, моя система должна следить за заголовком: «Совершенно новый горный велосипед!», повторять его через названия продуктов, и если он соответствует «Горный велосипед», она должна остановить цикл и отключить «Совершенно новый».

Так что у меня есть только строка: "горный велосипед".

Мой код (я строю в Wordpress):

    $current_title = get_the_title(); // "A brand new mountainbike!"
    $titles = new WP_Query( array( 'post_type' => 'products', 'posts_per_page' => 100 ) ); // List of titles
    if( $titles->have_posts() ) {
        while( $titles->have_posts() ) {
            $titles->the_post();
            $title = get_the_title(); // The product title from the list
            if( strpos( $current_title, $title ) ) {
                // Here I need to cut the product from the title
                $found = strpos( $current_title, $title );
                break;
            }
        }
    }

person Robbert    schedule 26.08.2014    source источник
comment
попробуйте использовать stripos(), он нечувствителен к регистру... и сопоставьте его с оператором !== false, потому что возврат 0 должен быть положительным совпадением   -  person RichardBernards    schedule 26.08.2014
comment
посмотрите на strcasecmp   -  person diEcho    schedule 26.08.2014
comment
Оба спасибо за комментарии. Я попробую!   -  person Robbert    schedule 26.08.2014
comment
Или вы можете попробовать использовать preg_match('/mountainbike/i',$ current_title,$match) и $match будут содержать ваш совпадающий ключ. Обратите внимание, что i делает его нечувствительным к регистру.   -  person MoshMage    schedule 26.08.2014
comment
Спасибо, это работает, но $match возвращает массив?   -  person Robbert    schedule 26.08.2014
comment
@MoshMage О, и это неправильно, потому что print_r($match); возвращает Массив ( [0] => Холодильник ). Итак, первый из списка, а не маунтинбайк.   -  person Robbert    schedule 26.08.2014
comment
@MoshMage Извините, это ошибка в моем цикле WordPress. Мне нужно было сбросить цикл после.   -  person Robbert    schedule 26.08.2014
comment
@Robbert Я предполагаю, что вам придется просмотреть список заголовков против $current_title - что-то вроде foreach($listOfTitles as $regTitle) { if (preg_match("/{$regTitle}/i",$current_title,$match) !== false) { // current_item_title_of_list_of_title exists in current_title } }   -  person MoshMage    schedule 26.08.2014
comment
@MoshMage Да, это то, что мне нужно. Но у меня почему-то не получается совпадение. Мой print_r($match); возвращает пустой массив() сейчас..   -  person Robbert    schedule 26.08.2014
comment
var_dump()s полностью и отлаживайте свои переменные; Проверьте на наличие ошибок или чего-то еще, пока я писал код в этом крошечном окне ответа, могут быть опечатки или что-то может быть не так. Кроме этого, IDK, что происходит - если он совпадал раньше, он должен совпадать сейчас   -  person MoshMage    schedule 26.08.2014
comment
@MoshMage Раньше это совпадало, потому что я сделал что-то не так в своем цикле Wordpress, поэтому $current_title и $regtitle всегда были одинаковыми.   -  person Robbert    schedule 26.08.2014
comment
Я думаю, это из-за обрыва. повторите это в цикле и посмотрите.   -  person Srihari Goud    schedule 26.08.2014
comment
@MoshMage Я удалил !== false, и теперь это работает!   -  person Robbert    schedule 26.08.2014


Ответы (2)


Благодаря MoshMage этот фрагмент кода решил мою проблему. Переменная $match теперь содержит название продукта.

$current_title = get_the_title();
$titles = new WP_Query( array( 'post_type' => 'products', 'posts_per_page' => -1 ) );
if( $titles->have_posts() ) {
   while( $titles->have_posts() ) {
        $titles->the_post();
        $title = get_the_title();
        if( preg_match('/' . $title . '/i', $current_title, $matched ) ) {
            $match = $matched[0];
        }
    }
} 
person Robbert    schedule 27.08.2014

Функция strpos() чувствительна к регистру, поэтому слово «Горный велосипед» не встречается в строке «Новый горный велосипед!».

Измените свое условие на:

if( stripos( $current_title, $title) !== false ) {
  • используйте stripos, нечувствительный к регистру.
  • а также используйте !== false, потому что если вы этого не сделаете, и символ будет найден в позиции 0, тогда вы подумаете, что совпадения не было - для получения дополнительной информации см. раздел "Возвращаемые значения" руководства по php

Весь код:

 $current_title = get_the_title(); // "A brand new mountainbike!"
    $titles = new WP_Query( array( 'post_type' => 'products', 'posts_per_page' => 100 ) );      // List of titles
    if( $titles->have_posts() ) {
        while( $titles->have_posts() ) {
            $titles->the_post();
            $title = get_the_title(); // The product title from the list
            if( stripos($current_title, $title) !== false ) {
                // Here I need to cut the product from the title
                $found = $title;
                break;
            }
        }
    }
person Tomor    schedule 26.08.2014
comment
Почему-то это не работает. Может, потому что я использую его в цикле так? И тогда, если следующий заголовок возвращает false, переменная не устанавливается? - person Robbert; 26.08.2014
comment
Я думаю, что вместо if( stripos( $current_title, $title !== false ) ) { вам следует использовать if( stripos( $current_title, $title) !== false ) { - person Pep; 26.08.2014
comment
Я обновил свой ответ - добавил весь код (см. Я также изменил строку с $found = $title;), а также исправил проблему с ) - person Tomor; 26.08.2014