Как я уже говорил в комментариях
function StringMatch($str1,$str2)
{
return preg_match('/\b'.preg_quote($str1,'/').'\b/i', $str2);
}
echo StringMatch("apple watch", "apple watches"); // output 0
echo "\n";
echo StringMatch("apple watch", "apple watch repairs"); // output 1
echo "\n";
echo StringMatch("apple watch", "new apple watch"); // output 1
echo "\n";
echo StringMatch("apple watch", "pineapple watch"); // output 0
echo "\n";
Вывод:
0
1
1
0
Песочница
Preg Цитата необходимо избегатьпроблемы, в которых $str1
может содержать такие вещи, как .
, в Regex - любой символ.
Кроме того, вы можете убрать знаки препинания следующим образом
$str1 = preg_replace('/[^\w\s]+/', '', $str1);
Например:
echo StringMatch("apple watch.", "apple watch repairs"); // output 1
Без удаления пунктуации это вернет 0. Скорее всего, это не ваше дело.
Песочница
ОБНОВЛЕНИЕ
Совпадение не по порядку, например:
//words out of order
echo StringMatch("watch apple", "new apple watch"); // output 1
Простой способ взорваться / взорваться:
function StringMatch($str1,$str2)
{
//use one or the other
$str1 = preg_replace('/[^\w\s]+/', '', $str1);
//$str1 = preg_quote($str1,'/');
$words = explode(' ', $str1);
preg_match_all('/\b('.implode('|',$words).')\b/i', $str2, $matches);
return count($words) == count($matches[0]) ? '1' : '0';
}
Песочница
Вы также можете пропустить взрыв / взорвать и использовать
$str1 = preg_replace('/\s/', '|', $str1);
, которые могут быть объединены с другим preg_replace
$str1 = preg_replace(['/[^\w\s]+/','/\s/'], ['','|'], $str1);
или все вместе
function StringMatch($str1,$str2)
{
$str1 = preg_replace(['/[^\w\s]+/','/\s/'], ['','|'], $str1);
preg_match_all('/\b('.$str1.')\b/i', $str2, $matches);
return (substr_count($str1, '|')+1) == count($matches[0]) ? '1' : '0';
}
Песочница
Но, конечно, вы не можете подсчитать массив слов, но вы можете подсчитать количество |
каналов, которое на 1 меньше, чем количество слов(отсюда +1).То есть, если вам важно, чтобы все слова совпадали.