1

私が取り組んでいるサイトには、用語集の用語で満たされたデータベーステーブルがあります。HTMLを取得し、用語集用語の最初のインスタンスをツールチップリンクに置き換える関数を作成しています。

しかし、私は問題にぶつかっています。これは1回の置換ではないため、この関数は前の反復で挿入されたテキストを置換しているため、HTMLが混乱しています。

肝心なのは、次の場合はテキストを無視する必要があると思います。

  • <および>任意のHTMLタグ内に表示される、または
  • <a></a>タグのテキスト内に表示されます。

これが私がこれまでに持っているものです。私はそこに誰かが賢い解決策を持っていることを望んでいました。

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;
}
4

2 に答える 2

1

HTMLを処理するために正規表現を使用することは常に危険なビジネスです。正規表現の貪欲さと怠惰をいじって、タグに含まれておらず、タグ名自体にも含まれていないテキストのみをキャプチャすることに長い時間を費やします。現在使用しているメソッドを破棄し、次のようなHTMLパーサーを使用してHTMLを解析することをお勧めします:http ://simplehtmldom.sourceforge.net/ 。私は以前にそれを使用し、他の人にそれをお勧めしました。これは、複雑なHTMLを処理するためのはるかに簡単な方法です。

于 2010-09-13T21:40:27.500 に答える
0

最終的にpreg_replace_callbackを使用して、既存のすべてのリンクをプレースホルダーに置き換えました。次に、新しい用語集のリンクを挿入しました。次に、置き換えたリンクを元に戻しました。

うまくいっています!

于 2010-09-22T02:22:07.027 に答える