Ne regex desen Bunun için ihtiyacım var?

5 Cevap php

Ben İngiliz İngilizce kelimeleri ile HTML American İngilizce kelimeleri yerine (PHP çalışmak için) bir regex gerekir. Yani renk metre renk, metre yerini olacağını ve böylece [I metre de bir İngiliz İngilizce kelime olduğunu biliyor, ama kopya için biz her zaman mesafe birimlere atıfta ziyade ölçüm cihazları edilecektir kullanarak olacak]. (Ben gerçek girişi üzerinde hiçbir kontrole sahip olarak, bu var olabilir ancak) desen aşağıdaki (biraz yapmacık) örnekler doğru çalışmak gerekir:

<span style="color:red">This is the color red</span>

[HTML etiketine rengi değiştirmek olmamalı ama cümlede değiştirmeniz gerekir]

<p>Color: red</p>

[Sözcüğü değiştirmek gerekir]

<p>Tony Brammeter lives 2000 meters from his sister</p>

[Adı kelime için değil, metre değiştirmeniz gerekir]

Ben yedek (onun adı örneğin Tony Metre ise) yararlı olmaz kenar durumlar vardır biliyorum, ama bu onlar gelip zaman biz onlarla başa çıkabilirim yeterince nadirdir.

5 Cevap

Html / xml düzenli ifadeler ile işlenen olmamalı, bu anything maç olacak birini oluşturmak için really zordur. Ama yerleşiğini dom extension kullanmak ve özyinelemeli sizin dize işleyebilir:

# Warning: untested code!
function process($node, $replaceRules) {
    foreach ($node->children as $childNode) {
        if ($childNode instanceof DOMTextNode) {
            $text = pre_replace(
                array_keys(replaceRules),
                array_values($replaceRules),
                $childNode->wholeText
            );
            $node->replaceChild($childNode, new DOMTextNode($text));
        } else {
            process($childNode, $replaceRules);
        }
    }
}
$replaceRules = array(
    '/\bcolor\b/i' => 'colour',
    '/\bmeter\b/i' => 'metre',
);
$doc = new DOMDocument();
$doc->loadHtml($htmlString);
process($doc, $replaceRules);
$htmlString = $doc->saveHTML();

Ben girişi üzerinde kontrol yok çünkü yerine, bu doğru çalışma almak için bir sözlük ve belki hatta bazı gramer analizi gerekir diye düşünüyorum. Saf bir regex çözüm gerçekten doğru verilerle bu tür işlemek mümkün olacak değildir.

Bu yüzden ilk önce değiştirilmesi gereken kelimeler listesi ile gelip öneririm, bu "renk" ve "metre" değil sadece. Wikipedia has some information on the topic.

Bunun için normal bir ifade istemiyorum. Düzenli ifadeler doğaları gereği vatansız, sen ve 'veri' bir html etiketi 'arasındaki farkı anlatmak için edebilmek için devletin bazı ölçmek gerekir.

Bir str_replace gibi bir şey ile birlikte bir HTML çözümleyici kullanılarak, hatta daha iyi, Lucero da anlaşılacağı gibi uygun bir gramer sözlük ve malzeme kullanmak istiyorum.

İkinci sorun daha kolaydır - kelime etrafında kelime sınırları varken değiştirmek istiyorum: http://www.regular-expressions.info/wordboundaries.html - bu Brammeter içinde metre yerine yok emin olacaktır.

İlk sorun çok daha zordur. HTML varlıkları içinde kelime yerine istemiyorum - <> karakterleri arasında bir şey. Yani, maç son gördüm> ya da hiçbir emin olmalısınız, ama asla sadece <. Bu zor ya, ve bazı lookahead/lookbehind assertions birleşimi veya düzenli ifadeler ile sadece düz imkansız gerektirir.

Bir devlet makinesini uygulayan bir betik burada çok daha iyi çalışacak.

Sen açıkça bir regex kullanmak gerekmez. Sen str_replace işlevini deneyin, ya da bunu str_ireplace function harf duyarsız kullanımı olması gerekiyor.

Örnek:

$str = "<p>Color: red</p>";
$new_str = str_ireplace ('%color%', 'colour', $str);

Yerine dize aramak istediğiniz tüm kelimeleri, bir dizi iletebilirsiniz.