Eklenecek başına eşleşmeleri görmezden, metnin içine çoklu bağlantılar takma

0 Cevap php

Ben üzerinde çalışıyorum Site sözlüğü terimlerle dolu bir veritabanı tablo vardır. Ben bazı HTML almak ve araç ipucu bağlantıları ile terimler sözlüğü ilk örneklerini yerini alacak bir fonksiyon inşa ediyorum.

Ama bir sorun haline çalıştırıyorum. Sadece bir yerine değil, çünkü işlev önceki yineleme takıldığı metin yerine, böylece HTML mucked oluyor.

Ben alt çizgi sanırım, ben metin görmezden gerekir eğer:

  • < içinde görünür ve > herhangi bir HTML etiketi veya
  • Bir <a></a> etiketinin metnin içinde.

İşte ben bugüne kadar ne var. Ben orada birisi akıllı bir çözüm olurdu umuyordum.

function insertGlossaryLinks($html)
{
    // Get glossary terms from database, once per request
    static $terms;
    if (is_null($terms)) {
        $query = Doctrine_Query::create()
            ->select('gt.title, gt.alternate_spellings, gt.description')
            ->from('GlossaryTerm gt');
        $glossaryTerms = $query->rows();

        // Create whole list in $terms, including alternate spellings
        $terms = array();
        foreach ($glossaryTerms as $glossaryTerm) {

            // Initialize with title
            $term = array(
                'wordsHtml' => array(
                    h(trim($glossaryTerm['title']))
                    ),
                'descriptionHtml' => h($glossaryTerm['description'])
                );

            // Add alternate spellings
            foreach (explode(',', $glossaryTerm['alternate_spellings']) as $alternateSpelling) {
                $alternateSpelling = h(trim($alternateSpelling));
                if (empty($alternateSpelling)) {
                    continue;
                }
                $term['wordsHtml'][] = $alternateSpelling;
            }

            $terms[] = $term;
        }
    }

    // Do replacements on this HTML
    $newHtml = $html;
    foreach ($terms as $term) {
        $callback = create_function('$m', 'return \'<a href="javascript:void(0);" class="glossary-term" title="'.$term['descriptionHtml'].'"><span>\'.$m[0].\'</span></a>\';');
        $term['wordsHtmlPreg'] = array_map('preg_quote', $term['wordsHtml']);
        $pattern = '/\b('.implode('|', $term['wordsHtmlPreg']).')\b/i';
        $newHtml = preg_replace_callback($pattern, $callback, $newHtml, 1);
    }

    return $newHtml;
}

0 Cevap