比较两个包含重音的字符串时遇到问题。 这是我的情况:
第一个字符串是: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然后我知道这个词被包含了......但我需要更多的帮助.... 提前谢谢,
答案 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"
请注意:
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);
}