php strpos и примерное совпадение с разницей в 1 символ

Я искал систему, но не мог найти никакой помощи, которую я мог понять в этом, так что здесь...

Мне нужно найти приблизительное соответствие для строки в php.

По сути, я проверяю, что все $ names находятся в строке $ cv, и если нет, устанавливает флаг в true.

foreach( $names as $name ) {
    if ( strrpos( $cv, $name ) === false ) {
        $nonameincv = true;
    }
}

Работает нормально. Тем не менее, у меня был случай $cv = "marie_claire" и $ name = "clare", которые устанавливали флаг (конечно), но который мне бы хотелось, чтобы strpos "нашел" как бы.

Можно ли выполнить приблизительное совпадение, чтобы, если в строке была 1 лишняя буква, она соответствовала? Например, чтобы:

$ name = "clare" находится в $cv = "marie_claire"

$ name = "caire" находится в $cv = "marie_claire"

$ name = "laire" находится в $cv = "marie_claire"

и так далее...

2 ответа

Решение

Примечание: это будет прекрасно работать, когда есть разница 1 характер, как указано в вопросе выше.

Попробуйте этот фрагмент кода здесь

<?php
ini_set('display_errors', 1);
$stringToSearch="mare";
$wholeString = "marie_claire";

$wholeStringArray=  str_split($wholeString);
for($x=0;$x<strlen($wholeString);$x++)
{
    $tempArray=$wholeStringArray;
    unset($tempArray[$x]);
    if(strpos(implode("", $tempArray),  $stringToSearch)!==false)
    {
        echo "Found: $stringToSearch in ".implode("", $wholeStringArray);
        break;
    }
}

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

$names = array("clare", "caire", "laire");
$cv = "marie_claire";

foreach( $names as $name ) {
    $sname = str_split($name);
    $words = explode('_', $cv);
    foreach($words as $word) {
        $sword = str_split($word);
        $result = array_diff($sword, $sname);
        if(count($result) < 2)
            echo $name. ":true\r\n";
    }
}
Другие вопросы по тегам