比较php中带有重音的字符串


comparing string with accents in php

我在比较包含口音的两个字符串时遇到问题。这是我的情况:

第一个字符串是:Master 第二个字符串:Máster Diseño Producción

然后,我需要从第二个字符串中删除单词Máster,因为它包含在第一个字符串中。

我已经创建了一个函数来清理每个字符串:

function sanear_string($cadena)
{
    $cadena = trim($cadena);
    $cadena = str_replace(
        array('á', 'à', 'ä', 'â', 'ª', 'Á', 'À', 'Â', 'Ä'),
        array('a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A'),
        $cadena
    );
    $cadena = str_replace(
        array('é', 'è', 'ë', 'ê', 'É', 'È', 'Ê', 'Ë'),
        array('e', 'e', 'e', 'e', 'E', 'E', 'E', 'E'),
        $cadena
    );
    $cadena = str_replace(
        array('í', 'ì', 'ï', 'î', 'Í', 'Ì', 'Ï', 'Î'),
        array('i', 'i', 'i', 'i', 'I', 'I', 'I', 'I'),
        $cadena
    );
    $cadena = str_replace(
        array('ó', 'ò', 'ö', 'ô', 'Ó', 'Ò', 'Ö', 'Ô'),
        array('o', 'o', 'o', 'o', 'O', 'O', 'O', 'O'),
        $cadena
    );
    $cadena = str_replace(
        array('ú', 'ù', 'ü', 'û', 'Ú', 'Ù', 'Û', 'Ü'),
        array('u', 'u', 'u', 'u', 'U', 'U', 'U', 'U'),
        $cadena
    );
    $cadena = str_replace(
        array('ñ', 'Ñ', 'ç', 'Ç'),
        array('n', 'N', 'c', 'C',),
        $cadena
    );
    //Esta parte se encarga de eliminar cualquier caracter extraño
    $cadena = str_replace(
        array("''", "¨", "º", "-", "~",
            "#", "@", "|", "!", "'"",
            "·", "$", "%", "&", "/",
            "(", ")", "?", "'", "¡",
            "¿", "[", "^", "`", "]",
            "+", "}", "{", "¨", "´",
            ">", "<", ";", ",", ":",
            ".", " "),
        '',
        $cadena
    );

    return $cadena;
}

它帮助我解决口音问题。现在我可以使用strpos来比较两个字符串…如果result> 0,那么我知道这个单词包含…但是我需要更多的帮助....提前感谢,

在处理字符集问题时,通常需要特别注意多字节字符串和纯ASCII字符串之间的字符数。

这里最大的问题是您从清理过的字符串中删除了一些预定义的字符,使经过清理的字符串与原始字符串之间的字符计数一致,从而大大强化了删除。

我将使用您的消毒函数的修改版本:

function sanitize($cadena) {
    $cadena = str_replace(
        array('á', 'à', 'ä', 'â', 'ª', 'Á', 'À', 'Â', 'Ä'),
        array('a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A'),
        $cadena
    );
    $cadena = str_replace(
        array('é', 'è', 'ë', 'ê', 'É', 'È', 'Ê', 'Ë'),
        array('e', 'e', 'e', 'e', 'E', 'E', 'E', 'E'),
        $cadena
    );
    $cadena = str_replace(
        array('í', 'ì', 'ï', 'î', 'Í', 'Ì', 'Ï', 'Î'),
        array('i', 'i', 'i', 'i', 'I', 'I', 'I', 'I'),
        $cadena
    );
    $cadena = str_replace(
        array('ó', 'ò', 'ö', 'ô', 'Ó', 'Ò', 'Ö', 'Ô'),
        array('o', 'o', 'o', 'o', 'O', 'O', 'O', 'O'),
        $cadena
    );
    $cadena = str_replace(
        array('ú', 'ù', 'ü', 'û', 'Ú', 'Ù', 'Û', 'Ü'),
        array('u', 'u', 'u', 'u', 'U', 'U', 'U', 'U'),
        $cadena
    );
    $cadena = str_replace(
        array('ñ', 'Ñ', 'ç', 'Ç'),
        array('n', 'N', 'c', 'C',),
        $cadena
    );

    return strtolower($cadena);
}

remove_word函数如下:

function remove_word($haystack , $needle) {
    // sanitize input strings
    $haystack_san = sanitize($haystack);
    $needle_san = sanitize($needle);
    // Check for character loss
    if (mb_strlen($haystack_san, 'UTF-8') != mb_strlen($haystack, 'UTF-8') || mb_strlen($needle_san, 'UTF-8') != mb_strlen($needle, 'UTF-8')) {
        // Here for debugging purposes. You may want to drop it in production.
        echo "Lost some chars on the way. Aborting.'n";
        echo "     haystack: $haystack (".mb_strlen($haystack, "UTF-8").")'n";
        echo " haystack_san: $haystack_san (".mb_strlen($haystack_san, "UTF-8").")'n";
        echo "       needle: $needle (".mb_strlen($needle, "UTF-8").")'n";
        echo "   needle_san: $needle_san (".mb_strlen($needle_san, "UTF-8").")'n";
        return;
    }
    // Check if $needle is found in $haystack
    if (($pos = strpos($haystack_san, $needle_san)) !== false) {
        // Get the string before the word
        $new = mb_substr($haystack, 0, $pos, 'UTF-8');
        // If applicable, get the string after
        if (mb_strlen($haystack, 'UTF-8') - $pos - mb_strlen($needle, 'UTF-8') > 0)
            $new .= mb_substr($haystack, $pos + mb_strlen($needle), NULL, 'UTF-8');
        // Return it
        return $new;
    }
    // If the word wasn't found, return $haystack as-is
    return $haystack;
}
echo remove_word("Hola, Máster Diseño Producción", "Master");
// "Hola,  Diseño Producción"

注意:

  • 假设你的字符串是UTF-8
  • 代码依靠mb_*函数来处理多字节字符
  • 这只替换单词的第一个出现(如果你想替换所有出现,你可以调用remove_word直到字符串不再改变)

如果result是> 0,那么我知道这个词包含

不完全是。如果子字符串偏移量为零,strpos()将返回0,就像字符串:'Master''Master Diseno Produccion'的情况一样(假设您的口音删除功能按预期工作)。你需要的是严格的(===)与false的比较,例如:

if(strpos($haystack, $needle) !== false) {
    // $needle exists in $haystack
} else {
    // no $needle in $haystack.
}
也就是说,如果您的目标是从$str中删除$substr,请使用:
str_replace($substr, '', $str)

根据上面的答案(包括更多的字符),我来试试;

/**
 * sanitize
 * 
 * @see     https://stackoverflow.com/a/23782573/115025
 * @access  public
 * @param   string $str
 * @return  string
 */
function sanitize(string $str): string
{
    $str = str_replace(
        array('à', 'á', 'â', 'ä', 'æ', 'ã', 'å', 'ā', 'À', 'Á', 'Â', 'Ä', 'Æ', 'Ã', 'Å', 'Ā'),
        array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'),
        $str
    );
    $str = str_replace(
        array('ç', 'ć', 'č', 'Ç', 'Ć', 'Č'),
        array('c', 'c', 'c', 'C', 'C', 'C'),
        $str
    );
    $str = str_replace(
        array('è', 'é', 'ê', 'ë', 'ē', 'ė', 'ę', 'È', 'É', 'Ê', 'Ë', 'Ē', 'Ė', 'Ę'),
        array('e', 'e', 'e', 'e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'E', 'E', 'E'),
        $str
    );
    $str = str_replace(
        array('î', 'ï', 'í', 'ī', 'į', 'ì', 'Î', 'Ï', 'Í', 'Ī', 'Į', 'Ì'),
        array('i', 'i', 'i', 'i', 'i', 'i', 'I', 'I', 'I', 'I', 'I', 'I'),
        $str
    );
    $str = str_replace(
        array('ł', 'Ł'),
        array('l', 'L'),
        $str
    );
    $str = str_replace(
        array('ñ', 'ń', 'Ñ', 'Ń'),
        array('n', 'n', 'N', 'N'),
        $str
    );
    $str = str_replace(
        array('ô', 'ö', 'ò', 'ó', 'œ', 'ø', 'ō', 'õ', 'Ô', 'Ö', 'Ò', 'Ó', 'Œ', 'Ø', 'Ō', 'Õ'),
        array('o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O'),
        $str
    );
    $str = str_replace(
        array('ß', 'ś', 'š', 'Ś', 'Š'),
        array('ss', 's', 's', 'S', 'S'),
        $str
    );
    $str = str_replace(
        array('û', 'ü', 'ù', 'ú', 'ū', 'Û', 'Ü', 'Ù', 'Ú', 'Ū'),
        array('u', 'u', 'u', 'u', 'u', 'U', 'U', 'U', 'U', 'U'),
        $str
    );
    $str = str_replace(
        array('ÿ', 'Ÿ'),
        array('y', 'Y'),
        $str
    );
    $str = str_replace(
        array('ž', 'ź', 'ż', 'Ž', 'Ź', 'Ż'),
        array('z', 'z', 'z', 'Z', 'Z', 'Z'),
        $str
    );
    return strtolower($str);
}