У меня есть группа строк, как («привет», «привет», «как дела», «как дела», «как дела», «как дела» и т. д.) и я хочу создать функцию, которая может сравнивать переменную строки (как $ varible = «Helloooo») с группой строк. Regex или любой метод полезен для меня.
Строка может быть больше, но не может отсутствовать, например:
Привет = должно быть правда
Helloooo = должно быть правда
Как ты !!!! = должно быть правда
ад = должно быть ложный
w есть y = должно быть ложный
привет привет = должно быть правда
привет, братан, должно быть правда
Я говорю об этой группе строк («привет», «привет», «как дела», «как дела», «как дела», «как дела» и т. д.)
Я говорю «строковая группа», потому что тип не должен быть массивом, но также может быть массивом. Как я уже сказал, любой метод полезен для меня.
Спасибо за вашу поддержку.
Вот способ сделать это. Насколько я понимаю, вы хотите, чтобы это было без учета регистра, это то, что strtolower
s для
$parts = ['hello', 'hi', 'how r u', 'how are you', 'how r you', 'how are u'];
function wordContainsPart($parts, $word) {
$word = strtolower($word);
foreach($parts as $part){
$part = strtolower($part);
if(strpos($word, $part) !== false) {
return true;
}
}
return false;
}
В вашем случае вам нужно только проверить, является ли предоставленное слово словарным словом или нет. Более технически, это имеет ли поставляемое слово какое-либо из словарных слов как его подпоследовательность. Если в словаре есть слово как подпоследовательность предоставленного слова, мы возвращаем true, иначе мы возвращаем false.
<?php
$dictionary = array("hello", "hi", "how r u", "how are you", "how r you", "how are u");
function isDictionaryWord($str,$dictionary){
foreach($dictionary as $each_word){
if(isSubsequence(strtolower($each_word),strtolower($str))){
return true;
}
}
return false;
}
function isSubsequence($needle,$haystack){
$len1 = strlen($needle);
$len2 = strlen($haystack);
if($len1 > $len2) return false;
$ptr = 0;
for($i=0;$i<$len2 && $ptr < $len1;$i++){
if($haystack[$i] === $needle[$ptr]) $ptr++;
}
return $ptr == $len1;
}
$tests = array(
'Hello',
'Helloooo',
'How r youuu !!!!',
'hell',
'w are y'
);
foreach($tests as $each_test){
echo $each_test," => ",var_dump(isDictionaryWord($each_test,$dictionary)),PHP_EOL;
}
Выход:
Hello => bool(true)
Helloooo => bool(true)
How r youuu !!!! => bool(true)
hell => bool(false)
w are y => bool(false)
Увидеть демонстрация.
Эта функция возвращает индекс массива первого совпадения или -1
если не найден
$array = ['hello', 'hi', 'how r u', 'how are you', 'how r you', 'how are u'];
function findStartString(array $startStrHaystack, string $needle)
{
foreach ($startStrHaystack as $idx => $startString)
if(0 === substr_compare($startString, $needle, 0, strlen($startString), true))
return $idx;
return -1;
}
Прецедент
$testCase = ['Hello', 'Helloooo', 'How r youuuu', 'hell', 'w are y'];
foreach ($testCase as $testString)
{
$idx = findStartString($array, $testString);
echo "The start of '$testString' ". ( $idx < 0
? 'does not match any string in given array.'
: "matches '{$array[$idx]}'.") . "\n";
}
результат:
/*
The start of 'Hello' matches 'hello'.
The start of 'Helloooo' matches 'hello'.
The start of 'How r youuuu' matches 'how r you'.
The start of 'hell' does not match any string in given array.
The start of 'w are y' does not match any string in given array.
*/
Вы можете создать регулярное выражение, соответствующее вашим строкам, добавив массив |
(оператор регулярного выражения ИЛИ) и тестирование этого для каждого значения с preg_match
. Обратите внимание, что мы добавляем i
модификатор регулярного выражения, чтобы сделать его нечувствительным к регистру:
$parts = ['hello', 'hi', 'how r u', 'how are you', 'how r you', 'how are u'];
$strings = ['Hello', 'Helloooo', 'How r youuuu', 'hell', 'w are y', 'heey hello', 'heeeey hello bro'];
$regexp = implode('|', $parts);
foreach ($strings as $string) {
echo "$string: " . (preg_match("/($regexp)/i", $string) ? "true\n" : "false\n");
}
Выход:
Hello: true
Helloooo: true
How r youuuu: true
hell: false
w are y: false
heey hello: true
heeeey hello bro: true