Bağlantı ile kelimeyi değiştirmek için PHP Düzenli İfade

2 Cevap php

Ben metin bir vücut ayrıştırmak ve bağlantıları ile bazı ifadeler yerine bir durum var. Sonra bağlantıları ile cümleleri ikinci setini değiştirmeniz yeniden ayrıştırmak dize gerekir. Sorun ikinci sette bazı kelimeler veya deyimler zaten ilk geçişte yerini cümleleri substringler olabilir, bu noktada ortaya çıkar.

Example: dizesi "filan kanyon filan" ilk geçişten sonra "filan <a href="#">grand canyon</a> filan" olacak. İkinci geçiş bir bağlantı ile kelime "kanyon" yerine deneyebilirsiniz, yani sonuçta, kırık, metin okurdu: "filan <a href="#"> büyük <a href="#"> kanyon {[(4) ]} filan ".

Sadece bir bağlantı değil zaten metin değiştirerek - Yani meydana gelen iç içe <a> etiketleri önlemek için preg_replace ve normal bir ifade kullanmaya çalışıyorum. Ben orada metin üzerinde </a> etiketleri daha fazla ama bu işe alınamıyor olmadığını dayalı onay regexes çalıştık.

Belki başka bir yaklaşım gereklidir?

Many thanks in advance! Dave

2 Cevap

Bu tüm geçiş için işe yarayabilecek:

$string = preg_replace('/([^>]|^)grand canyon\b/','$1<a href=#>grand canyon</a>',$string);

EDIT: Metin "Amazonas> Büyük Kanyon" gibi şeyler içerir zaman eksik göze varsayarak

: İkinci aşamada, sen gibi bir regex kullanabilirsiniz

(<a[^>]*>.*?</a>)|grand

Bu regex bir bağlantı veya kelime "büyük" ile eşleşir. Bağlantı eşleşti ise, ilk (ve tek) yakalayan gruba yakalanır. Grup eşleşti, sadece mevcut bağlantıyı yeniden takın. Kelimesi büyük maçlar, bunu bir bağlantı dışında olduğunu biliyorum, ve bir bağlantı içine açabilirsiniz.

PHP Eğer preg_replace_callback ile yapabilirsiniz:

$result = preg_replace_callback('%(<a[^>]*>.*?</a>)|grand%', compute_replacement, $subject);

function compute_replacement($groups) {
    // You can vary the replacement text for each match on-the-fly
    // $groups[0] holds the regex match
    // $groups[n] holds the match for capturing group n
    if ($groups[1]) {
        return $groups[1];
    } else {
        return "<a href='#'>$groups[0]</a>";
}