За последние 24 часа нас посетил 22461 программист и 1026 роботов. Сейчас ищут 635 программистов ...

Сравнить две строки

Тема в разделе "PHP для новичков", создана пользователем japan_parts, 28 май 2023.

  1. japan_parts

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

    С нами с:
    28 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Задача сделать сравнение двух строк на совпадение словосочетания

    Данные
    $el2 = "Пользовались один раз";
    $elem_pq['description'] = "Пользовались один раз,"
    тут в тексте стоит в конце запятая

    Я использую
    Код (Text):
    1. if (mb_strpos($elem_pq['description'],$el2)== false)
    Но эта функция не учитывает, когда в тексте есть запятые, точки и другие знаки. И такой текст она не находит. Как мне сделать чтобы эти все знаки не учитывались. Спасибо
     
  2. Survivor

    Survivor Новичок

    С нами с:
    8 фев 2023
    Сообщения:
    61
    Симпатии:
    9
    Не для чата что-то вроде антимат системы делаешь случаем?

    PHP:
    1. function compareStrings(string $str1, string $str2): bool {
    2.     // Очищаем строки от спец. символов, оставляем только печатные буквы и цифры
    3.     $str1 = preg_replace("/[^A-Za-z0-9 ]/ui", '', $str1);
    4.     $str2 = preg_replace("/[^A-Za-z0-9 ]/ui", '', $str2);
    5.  
    6.     // Сравниваем обе строки без учета регистра
    7.     return strcasecmp($str1, $str2) === 0;
    8. }
    9.  
    10. //- Строка 1
    11. $text = 'пРивЕт,';
    12. //- Строка 2
    13. $text2 = 'ПРИВЕТ';
    14.  
    15. if ( !compareStrings($text, $text2) )
    16. {
    17.     print 'Не совпало';
    18. }
    19. else
    20. {
    21.     print 'Совпало';
    22. }
    p.s. Это строгое сравнение, если нужно что-то более сложное, когда у тебя два одинаковых предложения, но написаны в обратном порядке, а ты хочешь найти конкретное слово, придется работать с массивом, т.е. разбивать строки.
     
    #2 Survivor, 28 май 2023
    Последнее редактирование: 28 май 2023
  3. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    856
    Симпатии:
    132
    @Survivor, регулярка кириллицу сожрёт, не?
     
  4. Survivor

    Survivor Новичок

    С нами с:
    8 фев 2023
    Сообщения:
    61
    Симпатии:
    9
    Конечно, модификаторы же указаны
     
  5. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    856
    Симпатии:
    132
    ишь ты, и правда )
     
  6. antoniii

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

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    Регулярка неправильная
     
  7. japan_parts

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

    С нами с:
    28 сен 2013
    Сообщения:
    39
    Симпатии:
    0

    сделал так..но почему то регистр учитывается. а надо чтобы не учитывал
     
  8. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    856
    Симпатии:
    132
    кодировка UTF-8?
     
  9. japan_parts

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

    С нами с:
    28 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    да видимо проблема с кодировками. mb_strpos справляется
     
  10. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    856
    Симпатии:
    132
    проверял у себя ф-цию compareStrings(), на utf-8 пример от автора ф-ции отрабатывает корректно.
     
  11. japan_parts

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

    С нами с:
    28 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    я не знаю в чем проблема я сменил на функцию mb_strpos и все работает. strcasecmp не хочет работать

    но mb_strpos мне не подходит она не делает точное сравнение слово сочетаний
     
  12. japan_parts

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

    С нами с:
    28 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Всем спасибо но проблема была просто в регистре. Поэтому у меня не искалось. Регулярка не нужна mb_stripos справляется со спец символами и регистром
    --- Добавлено ---
    Код (Text):
    1. if (mb_stripos($elem_pq['description'],$el2,0, 'UTF-8')!==false)
     
  13. Survivor

    Survivor Новичок

    С нами с:
    8 фев 2023
    Сообщения:
    61
    Симпатии:
    9
    Настрой правильно сервер, базу, чтобы не использовать в будущем конверторы всякие и не "хапать ошибки".
    Ещё можно в нижний регистр привести "mb_strtolower"
     
  14. japan_parts

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

    С нами с:
    28 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    почему то strcasecmp регистр не учитывает. Может кто что знает подскажите почему. Ведь должна. Пока пришлось применить так

    mb_internal_encoding('utf-8');
    strcasecmp(mb_strtolower($elem_pq['description']),$el2) == 0)
     
  15. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Ман: "only ASCII letters are compared in a case-insensitive way"
     
  16. japan_parts

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

    С нами с:
    28 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    я пробовал переводить в эти буквы. функция вообще не работает с ней
     
  17. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    152
    Симпатии:
    40
    Адрес:
    Барнаул
    compareStrings - работает не корректно, регулярки неправильные.
    PHP:
    1. $var1 = "Проверка";
    2. $var2 = "проверка";
    3.  
    4. $str1 = iconv('utf-8', 'ascii//TRANSLIT', $var1);
    5. $str2 = iconv('utf-8', 'ascii//TRANSLIT', $var2);
    6.  
    7. if (strcasecmp($str1, $str2) == 0) {
    8.     echo '$var1 равно $var2 при сравнении без учёта регистра';
    9. }