Smiley HTML-String CDATA içinde değiştirin

5 Cevap php

(Ben göre smiley-görüntü ile metin ifadeleri değiştirmek gerekir ok .. gerçekten karmaşık thats değil, ama şimdi ben HTML Etiketler dışında sadece smiley görünüşleri değiştirmek zorunda kısa examplae:. i. basit bir sorun var:

Metin:

Thats a good example :/ .. with a <a href="http://www.foobar.com">link</a> inside.

ben bu gülen görüntü ile ":/" değiştirmek istiyor ...

Tamam, nasıl en iyi şekilde yapmak için?

5 Cevap

Ben bazı süper komut dosyası oluşturmak için çalışıyorum ama bunu düşünmek olmaz .... gülümsemeleri hemen her zaman boşluklar ile çevrilidir. Yani str replace ':/' gülen. Sen "(Bu en çok kullanılan nerede olacağını) ne bir cümlenin sonunda gülen hakkında" diyerek olabilir. Peki sadece sol veya potansiyel gülen sağ ya da üzerinde en az bir boşlukla kontrol edin.

Yukarıdaki komut dosyalarını kullanarak:

$smiley_array = array(
    ":) " => "<a href...>",
    " :)" => "<a href...>",
    ":/ " => "<a href...>",
    " :/" => "<a href...>");
$codes = array_keys($smiley_array);
$links = array_values($smiley_array);
$str = str_replace($codes, $links, $str);

Bunun yerine her şeyi yazmak zorunda değilse iki kez tek bir gülen diziden dizi oluşturabilir.

Geriye bakan bir iddia ile preg_replace kullanın. Örnek:

$smileys = array(
  ':/' => '<img src="..." alt=":/">'
);
foreach ($smileys as $smile => $img) {
  $text = preg_replace('@(?<!<[^<>]*)' . preg_quote($smile, '@') . '@',
                       $img, $text);
}

Regex içine açılı ayraçlar değil sadece suratlar aynı olmalıdır. Eğer yanlış pozitif bir sürü varsa, bu yavaş olabilir.

Ben best arada, ben bunu yapmak istiyorum sadece yol hakkında bilemeyiz.

Değer olarak tuşları ve bağlantı olarak gülen kodları olan bir dizi oluşturun. Kullanımı str_replace. "Iğne" tuşları (gülen kodları) bir dizi olarak ve değerler dizisi "yerine" olarak geçmektedir.

Örneğin, böyle bir şey olduğunu varsayalım:

$smiley_array = array(":)" => "<a href...>",
    ":(" => "<a href=....>");
$codes = array_keys($smiley_array);
$links = array_values($smiley_array);
$str = str_replace($codes, $links, $str);

EDIT: durumda bu yanlışlıkla preg_replace ile Regexes kullanmayı düşünmelisiniz smiley-bağlantıları ile diğer örneklerini yerini alabilir. Açıkçası preg_replace is str_replace daha yavaştır.

Sen regex veya yukarıda ekstra özensiz sürümünü kullanabilirsiniz:

$smiley_array = array(":)" => "<a href...>",
    ":(" => "<a href=....>");
$codes = array_keys($smiley_array);
$links = array_values($smiley_array);
$str = str_replace("://", "%%QF%%", $str);
$str = str_replace($codes, $links, $str);
$str = str_replace("%%QF%%", "://", $str);

Actually, assuming str_replace follows the array sorting... this should work:

$smiley_array = array("://" => "%%QF%%", ":)" => "<a href...>",
    ":(" => "<a href=....>", "%%QF%%" => "://");
$codes = array_keys($smiley_array);
$links = array_values($smiley_array);
$str = str_replace($codes, $links, $str);

Olası overkill (artmış cpu / yük), ancak 99,99999999% güvenli:

<?php
$n = new DOMDocument();
$n->loadHTML('<p>Thats a good example :/ .. with a <a href="http://www.foobar.com">link</a> inside.</p>');
$x = new DOMXPath($n);
$instances = $x->query('//text()[contains(.,\':/\')]');//or use '//*[child::text()]' for all textnodes
foreach($instances as $node){
    if($node instanceof DOMText && preg_match_all('/:\//',$node->wholeText,$matches,PREG_OFFSET_CAPTURE|PREG_SET_ORDER)){
            foreach($matches[0] as $match){
                    $newnode = $node->splitText($match[1]);
                    $newnode->replaceData(0,strlen($match[0]),'');
                    $img = $n->createElement('img');
                    $img->setAttribute('src','smily.gif');
                    $img = $newnode->parentNode->insertBefore($img,$newnode);
                    //var_dump($match);
            }
    }
}
var_dump($n->saveHTML());
?>

Ama gerçekte bunu yapmak istemediğiniz kullanıcıların WYSIWYG html (beit düzenlemek veya elsewise, 'geri dönüş' dönüşüm (metin img) bir sürü hafif icar ise genellikle, bir zamanlar kurtarmak birçok gösteriyor ki bütün . kadar size farklı ifadelerle (onları maç bir canavar regex, ya da birkaç küçük olanları / strstr () 'okunabilmesi için s ve src gülen için bir dizi (örneğin, array (' :/ '=>' kaşlarını ile genişletin. gif ')) gitmek için yol olacaktır.