我在比较包含口音的两个字符串时遇到问题。这是我的情况:
第一个字符串是: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);
}