我怎样才能preg_replace像'Prêt-à-porter'这样的特殊角色?

时间:2010-01-12 16:59:44

标签: php preg-replace

在这个论坛和网络上,有很多关于此的问题。 但我不只是得到它。

这是我的代码:

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

6 个答案:

答案 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)

到目前为止,您的代码使用最新的编辑方式,这样做:

  1. 表达式/[^a-zA-Z-êàé]/表示“匹配任何英文字母,减号,ê,à或é”。

  2. preg_replace($pattern, '', 'Prêt-à-porter')返回'Prêt-à-porter',因为没有匹配。

  3. json_encode()返回'Prêt-à-porter'的JSON表示,即'r \ u00eat- \ u00e0-porter'

  4. 我不清楚你的确切目标是什么。如果你想删除任何不是减号或字母的东西,你可以尝试这种模式:

    /[^\w0-9]/u
    

答案 5 :(得分:0)

您还可以使用mb_ereg_replace()处理字符串中的多字节字符。