Nasıl 'Pret-à-porter' gibi özel bir karakter preg_replace olabilir?

6 Cevap php

There are heaps of Qs about this on this forum and on the web in general. But I don't just get it.

İşte benim kod:

function updateGuideKeywords($dal)
{
    $pattern = "/[^a-zA-Z-êàé]/";
    $keywords = preg_replace($pattern, '', $_POST['keywords']);
    echo json_encode($keywords);
}

Şimdi, giriş Prêt-à-porter, ve çıkış "Pr\u00eat-\u00e0-porter" olduğunu.

Neden '\ u00e' alabilirim?

Ve nasıl karakterleri ê, à ve é dahil benim desen değiştirebilir?

EDIT
humm... since it looks like a unicode / character issue, I might go for the solution I found on this page.

İşte onlar böyle bir şey yapıyor öneririz:

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

EDIT 2
This is my solution so far:

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 Cevap

Ve "Pr\u00eat-\u00e0-porter" is Doğru bir JavaScript dize değişmezi gösterimi Prêt-à-porter. Ben hat boyunca bir noktada json_encode yapıyoruz varsayıyorum?

Not Ayrıca PHP'nin düzenli ifadeler Unicode farkında olmadıklarını, bu yüzden UTF-8 (genellikle olmak istediğiniz) kullanıyorsanız, karakter ê tek bir karakter değil, bayt C3 byte izledi AA. , Bu basit edebi maçlar için iyi, ama bir karakter sınıfı gibi durumlarda yerine şimdi birbirlerinin ardına ayrı ayrı iki bayt eşleşen konum kolayca hangi pisliği ifade olabilir.

Kullanmak iconv() / / DAMGAÇEVİRİSİ değiştirici, 'e' ile vb 'e' değiştirmek istiyorsanız

örneğin,

$newString = iconv('UTF-8', 'ASCII//TRANSLIT', $myString);

Daha kapsamlı bir örnek:

$ 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""
$ 

Bu% 100 doğru olabilir, ama regex bakarak i preg_replace sanmıyorum () kullanarak sorunu olmayabilir. Ben '\ u00e' alıyorsanız sebebi karakter kodlamaları php kötü desteği nedeniyle olduğunu düşünüyorum.

Ben çıktı gördüğünüzden, karakterler (dolayısıyla desen) kaldırıldı, bu yüzden tek şey çıkış unicode yapılmış olmasıdır değildir. Onlar zaten dönüştürülmüş olacak gibi UTF-8 veya kodlamak HTML kuruluşlara belgenizi değiştirmek ve çalışması gerekir deneyin, ama değiştirmeden önce varlıklarını kodlaması sakının, onları tespit olmayacaktır.

Kodunuzu, şimdiye kadar son düzenlemeler ile, bu şekilde çalışır:

  1. Ifadesi /[^a-zA-Z-êàé]/ ", ê, eksi işareti, not İngilizce mektup à veya é bulunuyor şey maç" anlamına gelir.

  2. preg_replace($pattern, '', 'Prêt-à-porter') döndürüyor 'Pret-à-porter' hiçbir şey ile eşleşir beri.

  3. json_encode () 'r \ u00eat-\ u00e0-porter' olduğu 'Pret-à-porter "JSON temsilini döndürür

Bu kesin bir hedef ne benim için net değil. Eğer bu modeli deneyebilirsiniz bir eksi ya da mektup değil bir şey çıkarmak istiyorsanız:

/[^\w0-9]/u

Ayrıca mb_ereg_replace() sizin dizesindeki çokbaytlı karakterlerle çalışmak için kullanabilirsiniz.