PHP: Поиск части слова в строке

142
11 декабря 2019, 06:10

Есть строка со списком слов. Есть определенное слово, которое нужно найти в этой строке. Я использую функцию strpos(), всё ок:

$mystring = 'apple,orange,pear,banana,mango';
$findme   = 'apple';
$pos = strpos($mystring, $findme);
if ($pos !== false) {
    echo "Строка '$findme' найдена в строке '$mystring'";
    echo " в позиции $pos";
} else {
     echo "Строка '$findme' не найдена в строке '$mystring'";
}

Однако, я хотел бы сделать поиск немного гибким, чтобы поиск осуществлялся по частям искомого слова. Например, слово для поиска будет не "apple", а "pineapple". В нашем случае функция ничего не найдет.

Я думаю, что можно эту задачу можно решить путем поиска каждого слова из списка в строке $findme:

$mystring = 'apple,orange,pear,banana,mango';
$findme   = 'pineapple';
$arr= explode(",", $mystring );
foreach($arr as $v){
    $pos = strpos($findme, $v);
    if ($pos !== false) {
        echo "Строка '$findme' найдена в строке '$mystring'";
        echo " в позиции $pos";
        break;
    } else {
         echo "Строка '$findme' не найдена в строке '$mystring'";
    }
}

Но а если словарь $mystring состоит из сотен тысяч слов. Тогда мой вариант будет работать очень медленно.

Подскажите, пожалуйста, как можно решить эту проблему?

Спасибо!

Answer 1

С помощью регулярных выражений, поиск не точных вхождений в подстроку можно организовать так:

$mystring = 'apple,orange,pear,banana,mango and pineapple';
$findme   = 'apple';
$patt = preg_quote($findme, '~');
preg_match_all("~\w*$patt\w*~", $mystring, $arr);
print_r($arr);

Результат

Array
(
    [0] => Array
        (
            [0] => apple
            [1] => pineapple
        )
)

нужно, чтобы строка $mystring = $mystring = 'apple,orange,pear,banana,mango', а $findme = 'pineapple'; И в $matches я увидел результат, что найдено

Тогда можно исходную строку использовать как шаблон:

$mystring = 'apple,orange,pear,banana,mango';
$findme   = 'pineapple';
$patt = join('|', explode(',', $mystring));
preg_match_all("~$patt~", $findme, $arr);
print_r($arr);

Результат:

Array
(
    [0] => Array
        (
            [0] => apple
        )
)
Answer 2

Никак.

Поиск по сотням тысяч слов, состряпанный на коленке в РНР скрипте будет всегда работать медленно. Для поиска по сотням тысяч слов следует использовать другие механизмы.
Самый простой - поместить слова в базу данных.

READ ALSO
Ошибка при обновлении ядра Drupal

Ошибка при обновлении ядра Drupal

Обновил ядро друпал с версии 764, на версию 8

170
SQL limit несколько условий [дубликат]

SQL limit несколько условий [дубликат]

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

166
Как перенаправлять запросы с сервера?

Как перенаправлять запросы с сервера?

Как перенаправлять запросы с помощьюhtaccess и сделать исключение

159
Отправка данных формы без перезагрузки

Отправка данных формы без перезагрузки

Друзья, я не силен в PHP и Ajax, по этому прошу помощиИмеется файл простой index

145