在这个论坛和网络上,有很多关于此的问题。 但我不只是得到它。
这是我的代码:
function updateGuideKeywords($dal)
{
$pattern = "/[^a-zA-Z-êàé]/";
$keywords = preg_replace($pattern, '', $_POST['keywords']);
echo json_encode($keywords);
}
现在,输入为Prêt-à-porter
,输出为"Pr\u00eat-\u00e0-porter"
。
为什么我会得到'\ u00e'?
如何更改模式以包含字符ê
,à
和é
?
修改
嗯...因为它看起来像一个unicode /字符问题,我可能会找到我在this page找到的解决方案。
他们建议这样做:
$chain="prêt-à-porter";
$pattern = array("'é'", "'è'", "'ë'", "'ê'", "'É'", "'È'", "'Ë'", "'Ê'", "'á'", "'à'", "'ä'", "'â'", "'å'", "'Á'", "'À'", "'Ä'", "'Â'", "'Å'", "'ó'", "'ò'", "'ö'", "'ô'", "'Ó'", "'Ò'", "'Ö'", "'Ô'", "'í'", "'ì'", "'ï'", "'î'", "'Í'", "'Ì'", "'Ï'", "'Î'", "'ú'", "'ù'", "'ü'", "'û'", "'Ú'", "'Ù'", "'Ü'", "'Û'", "'ý'", "'ÿ'", "'Ý'", "'ø'", "'Ø'", "'œ'", "'Œ'", "'Æ'", "'ç'", "'Ç'");
$replace = array('e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'A', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'i', 'i', 'i', 'I', 'I', 'I', 'I', 'I', 'u', 'u', 'u', 'u', 'U', 'U', 'U', 'U', 'y', 'y', 'Y', 'o', 'O', 'a', 'A', 'A', 'c', 'C');
$chain = preg_replace($pattern, $replace, $chain);
编辑2
到目前为止,这是我的解决方案:
function updateGuideKeywords()
{
//First we replace characters with accents
$pattern = array("'é'", "'è'", "'ë'", "'ê'", "'É'", "'È'", "'Ë'", "'Ê'", "'á'", "'à'", "'ä'", "'â'", "'å'", "'Á'", "'À'", "'Ä'", "'Â'", "'Å'", "'ó'", "'ò'", "'ö'", "'ô'", "'Ó'", "'Ò'", "'Ö'", "'Ô'", "'í'", "'ì'", "'ï'", "'î'", "'Í'", "'Ì'", "'Ï'", "'Î'", "'ú'", "'ù'", "'ü'", "'û'", "'Ú'", "'Ù'", "'Ü'", "'Û'", "'ý'", "'ÿ'", "'Ý'", "'ø'", "'Ø'", "'œ'", "'Œ'", "'Æ'", "'ç'", "'Ç'");
$replace = array('e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'A', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'i', 'i', 'i', 'I', 'I', 'I', 'I', 'I', 'u', 'u', 'u', 'u', 'U', 'U', 'U', 'U', 'y', 'y', 'Y', 'o', 'O', 'a', 'A', 'A', 'c', 'C'); $shguideID = $_POST['shguideID'];
$keywords = preg_replace($pattern, $replace, $_POST['keywords']);
//Then we remove unwanted characters by only allowing a-z, A-Z, comma, 'minus' and white space
$keywords = preg_replace("/[^a-zA-Z-,\s]/", "", $keywords);
echo json_encode($keywords);
}
答案 0 :(得分:4)
"Pr\u00eat-\u00e0-porter"
是Prêt-à-porter
的正确JavaScript字符串文字表示。我假设你在沿线的某个地方做了json_encode
?
另请注意,PHP的正则表达式不支持Unicode,因此如果您使用的是UTF-8(通常是您想要的),则字符ê
不是单个字符,而是字节C3,后跟字节AA。这对于简单的文字匹配来说很好,但在像字符类这样的情况下,你现在分别匹配两个字节而不是一个接一个地匹配,这很容易弄乱你的表达。
答案 1 :(得分:4)
如果您想将'é'替换为'e'等,请将iconv()与// TRANSLIT修饰符一起使用
例如,
$newString = iconv('UTF-8', 'ASCII//TRANSLIT', $myString);
更完整的例子:
$ cat scratch.php
<?php
$x = "Prêt-à-porter";
var_dump(json_encode(iconv("UTF-8", "ASCII//TRANSLIT", $x)));
$ php scratch.php
string(15) ""Pret-a-porter""
$
答案 2 :(得分:0)
这可能不是100%准确,但看着你使用的正则表达式我不认为preg_replace()是问题。我认为你得到'\ u00e'的原因是由于php对字符编码的支持不足。
答案 3 :(得分:0)
从我看到的输出结果来看,你的角色没有被移除(因此在你的模式中),所以唯一的一点是输出是用unicode制作的。尝试将您的文档更改为UTF-8或编码HTML实体,它应该可以工作,但要注意,如果您在替换之前编码实体,它将不会检测它们,因为它们已经被转换。
答案 4 :(得分:0)
到目前为止,您的代码使用最新的编辑方式,这样做:
表达式/[^a-zA-Z-êàé]/
表示“匹配任何不英文字母,减号,ê,à或é”。
preg_replace($pattern, '', 'Prêt-à-porter')
返回'Prêt-à-porter',因为没有匹配。
json_encode()返回'Prêt-à-porter'的JSON表示,即'r \ u00eat- \ u00e0-porter'
我不清楚你的确切目标是什么。如果你想删除任何不是减号或字母的东西,你可以尝试这种模式:
/[^\w0-9]/u
答案 5 :(得分:0)
您还可以使用mb_ereg_replace()处理字符串中的多字节字符。