Regex / preg_replace bir anahtar kelime için bir çapa etiketi eklemek için kullanılabilir mi?

2 Cevap php

Ben bu geçiş yapabilmek istiyorum ...

My sample [a id="keyword" href="someURLkeyword"] test keyword test[/a] link this keyword here.

To ...

My sample [a id="keyword" href="someURLkeyword"] test keyword test[/a] link this [a href="url"]keyword[/a] here.

Bazı varolan bir çapa etiketi veya içinde kullanılır çünkü ben sadece "anahtar kelime" tüm örneklerini yerini alamaz.

Not: Linux üzerinde PHP5 preg_replace kullanma.

2 Cevap

Düzenli ifadeler kullanarak bu sorunu çözmek için iyi bir yol olabilir, ama burada hızlı bir çözümdür olabilir:

function link_keywords($str, $keyword, $url) {
    $keyword = preg_quote($keyword, '/');
    $url = htmlspecialchars($url);

    // Use split the string on all <a> tags, keeping the matched delimiters:
    $split_str = preg_split('#(<a\s.*?</a>)#i', $str, -1, PREG_SPLIT_DELIM_CAPTURE);

    // loop through the results and process the sections between <a> tags
    $result = '';
    foreach ($split_str as $sub_str) {
        if (preg_match('#^<a\s.*?</a>$#i', $sub_str)) {
            $result .= $sub_str;
        } else {
            // split on all remaining tags
            $split_sub_str = preg_split('/(<.+?>)/', $sub_str, -1, PREG_SPLIT_DELIM_CAPTURE);
            foreach ($split_sub_str as $sub_sub_str) {
                if (preg_match('/^<.+>$/', $sub_sub_str)) {
                    $result .= $sub_sub_str;
                } else {
                    $result .= preg_replace('/'.$keyword.'/', '<a href="'.$url.'">$0</a>', $sub_sub_str);
                }
            }
        }
    }
    return $result;
}

Genel bir fikir linkleri ve her şeyin içine dize bölmek için. Sonra düz metin içine etiketleri ve düz metin ve insert bağlantıları içine link etiketinin dışında her şeyi bölünmüş. O [p class = "[a href =" url "] keyword [/ a]"] genişletilmiş olmaktan [p class = "keyword"] önleyecektir.

Yine, normal ifadeler içermeyen basit bir çözüm bulmak için çalışacağını söyledi.

Yalnız düzenli ifadelerle bunu yapamaz. Düzenli ifadeler bağlam ücretsiz - onlar sadece çevreye bakılmaksızın, bir desenle eşleşen. Ne istediğinizi yapmak için, bir soyut temsili içine kaynağını ayrıştırmak, ve sonra hedef çıkış içine transfor gerekir.