php解析器:确定通过regex找到的字符串是否在锚标记内

时间:2011-12-05 03:06:58

标签: php regex parsing dom anchor

已编辑。我知道不应使用正则表达式解析HTML。 我正在寻求帮助。如何在标签和文本的混合中找到任意字符串,然后确定它是否在锚内?

我的WordPress网站上有一个互动词汇表。 的一部分功能是在帖子的内容中搜索词汇表术语(文本字符串)。如果找到,该术语将包含在包含定义的自定义分类条目的链接中。

我喜欢它是如何工作的,但有一个问题是,如果该术语已经是链接的一部分,则术语表解析器通过在链接中插入链接来劫持当前链接。解析器纯粹基于正则表达式,没有DOM解析。 我知道HTML不应该使用正则表达式进行解析。但目前该功能只是搜索特定的文本字符串,而不是尝试对标记做任何事情。

但是有一个相对较快的(在处理方面)和可靠的方式我可以检查找到的字符串是否在锚标记内?显然这并不总是这样的,因为这个词可能看似在任何标签内。在这种情况下,词汇表解析器不会添加链接。我知道这个功能会使用DOM解析器,但我不确定从哪里开始。

解析器:

function glossary_parse($content){

    //Run the glossary parser
    if (((!is_page() && get_option('glossaryOnlySingle') == 0) OR
    (!is_page() && get_option('glossaryOnlySingle') == 1 && is_single()) OR
    (is_page() && get_option('glossaryOnPages') == 1))){
        $glossary_index = get_children(array(
                                            'post_type'     => 'glossary',
                                            'post_status'   => 'publish',
                                            ));
        $current_title = get_the_title();                                   
        if ($glossary_index){
            $timestamp = time();
            foreach($glossary_index as $glossary_item){
                $timestamp++;
                $glossary_title = $glossary_item->post_title;
                if ($current_title == $glossary_title) {
                continue;
                }
                $glossary_search = '/\b'.$glossary_title.'s*?\b(?=([^"]*"[^"]*")*[^"]*$)/i';
                $glossary_replace = '<a'.$timestamp.'>$0</a'.$timestamp.'>';
                if (get_option('glossaryFirstOnly') == 1) {
                    $content_temp = preg_replace($glossary_search, $glossary_replace, $content, 1);
                }
                else {
                    $content_temp = preg_replace($glossary_search, $glossary_replace, $content);
                }
                $content_temp = rtrim($content_temp);

                    $link_search = '/<a'.$timestamp.'>('.$glossary_item->post_title.'[A-Za-z]*?)<\/a'.$timestamp.'>/i';
                    if (get_option('glossaryTooltip') == 1) {
                        $link_replace = '<a class="glossaryLink" href="' . get_permalink($glossary_item) . '" title="Glossary: '. $glossary_title . '" onmouseover="tooltip.show(\'' . addslashes($glossary_item->post_excerpt) . '\');" onmouseout="tooltip.hide();">$1</a>';
                    }
                    else {
                        $link_replace = '<a class="glossaryLink" href="' . get_permalink($glossary_item) . '" title="Glossary: '. $glossary_title . '">$1</a>';
                    }
                    $content_temp = preg_replace($link_search, $link_replace, $content_temp);
                    $content = $content_temp;
            }
        }
    }
    return $content;
}

0 个答案:

没有答案