已编辑。我知道不应使用正则表达式解析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;
}