En iyi nasıl XHTML php kullanarak geçerli olmayan olarak görüyor unicode karakterleri kaldırırım?

2 Cevap php

Ben uluslararası matematik grubu desteklemek için tasarlanmış bir forum çalıştırmak. Geçenlerde uluslararası karakterlerin daha iyi destek için unicode için açık ettik. Bu dönüşüm hata ayıklama, ben değil tüm unicode karakter (ilgili web sitesi http://www.w3.org/TR/unicode-xml/ olarak görünür) geçerli XHTML olarak kabul edilir olduğunu keşfetti ettik. Forum yazılımı tarayıcıya mesajları sunmadan önce geçer adımlardan biri, bir XHTML doğrulama / sanitisation adımdır. O aşamada XHTML sevmiyor herhangi unicode karakterleri kaldırmak gerektiğini makul bir fikir gibi görünüyor.

Yani benim soru:

PHP bunu yapmanın standart bir (veya iyi) bir yolu var mı?

(Forum arada, PHP ile yazılmış.)

Ben emniyetli (o da en iyi, ben emin unicode? Ile düzgün çalıştığından emin olmak için ekstra bir şey yapmanıza gerek yok) basit bir str_replace olacağını tahmin ama gitmek zorunda beni içerecektir XHTML DTD (veya yukarıda başvurulan W3 sayfa) dikkatli str_replace ve search bölümünde listelenecek ne karakterleri anlamaya, bu yüzden en iyi yolu ise, birisi zaten yapmış Bu yüzden, o, err, kopya çalabilir?

(Bu arada, soruna neden karakter U +000 C 'formfeed' () W3 sayfasına göre geçerli HTML ama geçersiz XHTML olan oldu!)

2 Cevap

I found a function that might do what you want on phpedit.net.

Ben arşiv için işlevini göndeririz, PHPEdit.net LTP için kredi:

/**
 * Removes invalid XML
 *
 * @access public
 * @param string $value
 * @return string
 */
function stripInvalidXml($value)
{
    $ret = "";
    $current;
    if (empty($value)) 
    {
        return $ret;
    }

    $length = strlen($value);
    for ($i=0; $i < $length; $i++)
    {
        $current = ord($value{$i});
        if (($current == 0x9) ||
            ($current == 0xA) ||
            ($current == 0xD) ||
            (($current >= 0x20) && ($current <= 0xD7FF)) ||
            (($current >= 0xE000) && ($current <= 0xFFFD)) ||
            (($current >= 0x10000) && ($current <= 0x10FFFF)))
        {
            $ret .= chr($current);
        }
        else
        {
            $ret .= " ";
        }
    }
    return $ret;
}

Lütfen giriş utf8 olduğunu varsayarsak, sen gibi bir şey ile unicode aralıkları kaldırabilirsiniz

 preg_replace('~[\x{17A3}-\x{17D3}]~u', '', $input);

Başka ve daha iyi bir yaklaşım varsayılan ve görmek istiyorum sadece whitelist karakter her şeyi kaldırmaktır. Unicode özellikleri (\ p) için bu oldukça pratiktir. Örneğin, (unicode) harfler ve sayılar dışında her şeyi kaldırır:

  preg_replace('~[^\p{L}\p{N}]~u', '', $input)