比较字符串与php中的重音符号

时间:2014-05-21 11:11:28

标签: php string string-comparison

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

第一个字符串是:Master 第二个字符串是:MásterDiseñoProducció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比较两个字符串...如果结果是&gt; 0然后我知道这个词被包含了......但我需要更多的帮助.... 提前谢谢,

3 个答案:

答案 0 :(得分:1)

  

如果结果是&gt; 0然后我知道这个词包含

不完全是。如果substring offset为零,strpos()将返回0,如字符串:'Master''Master Diseno Produccion'(假设您的重音符删除功能按预期工作)。您需要的是严格(===)与false的比较,例如:

if(strpos($haystack, $needle) !== false) {
    // $needle exists in $haystack
} else {
    // no $needle in $haystack.
}

也就是说,如果您的目标是从$substr移除$str,请使用:

str_replace($substr, '', $str)

答案 1 :(得分:1)

正常处理字符集问题时,需要格外注意多字节字符串和普通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直到字符串不再更改)

答案 2 :(得分:0)

根据以上答案(包括更多字符),这是我的努力目标

/**
 * 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);
}