regex — Как сравнить строку с текстовой группой с переполнением стека

У меня есть группа строк, как («привет», «привет», «как дела», «как дела», «как дела», «как дела» и т. д.) и я хочу создать функцию, которая может сравнивать переменную строки (как $ varible = «Helloooo») с группой строк. Regex или любой метод полезен для меня.

Строка может быть больше, но не может отсутствовать, например:

Привет = должно быть правда

Helloooo = должно быть правда

Как ты !!!! = должно быть правда

ад = должно быть ложный

w есть y = должно быть ложный

привет привет = должно быть правда

привет, братан, должно быть правда

Я говорю об этой группе строк («привет», «привет», «как дела», «как дела», «как дела», «как дела» и т. д.)

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

Спасибо за вашу поддержку.

0

Решение

Вот способ сделать это. Насколько я понимаю, вы хотите, чтобы это было без учета регистра, это то, что strtolowers для

$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;
}
0

Другие решения

В вашем случае вам нужно только проверить, является ли предоставленное слово словарным словом или нет. Более технически, это имеет ли поставляемое слово какое-либо из словарных слов как его подпоследовательность. Если в словаре есть слово как подпоследовательность предоставленного слова, мы возвращаем 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)

Увидеть демонстрация.

0

Эта функция возвращает индекс массива первого совпадения или -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.
*/
0

Вы можете создать регулярное выражение, соответствующее вашим строкам, добавив массив | (оператор регулярного выражения ИЛИ) и тестирование этого для каждого значения с 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

Демо на 3v4l.org

0
По вопросам рекламы [email protected]