Как можно сравнить строку с текстовой группой с PHP - PullRequest
0 голосов
/ 18 декабря 2018

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

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

Hello = должно быть true

Helloooo = должно быть true

How r youuu !!!!= должно быть true

hell = должно быть false

w, y = должно быть false

heey hello = должно быть true

heeeey hello bro = должно быть true

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

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

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

Ответы [ 4 ]

0 голосов
/ 19 декабря 2018

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

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

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

Вот способ сделать это.Насколько я вижу, вы хотите, чтобы он был без учета регистра, это то, что 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;
}
...