在上一篇中,我们了解了我们的
插件所需要实现的功能,并构建了一个可以直接使用的关键字词典。那么今天我们就来使用这个关键字词典完成我们的
插件核心实现。
在 Magike 中,我们的文章输入是允许使用 HTML 标签的。大家都知道 HTML 标签中有很多标签,在这些标签中有一些标签的属性是允许使用自定义的字符串的,也就是说我们登记的关键字有可能出现在 HTML 标签的属性中。而在 HTML 标签的属性中的内容绝大部分是不允许再使用HTML标签来丰富它的表现。因此我们的第一步就应该是分离 HTML 标签和正文内容。
1. 分离 HTML 标签和正文内容
HTML 标签的特征是什么? HTML 标签的特征就是以 < 开始,以 > 结束。这种情况下,我们最适合用于切分内容的 PHP 函数就是 preg_split()。
preg_split 的原型:
复制内容到剪贴板
代码:
数组 preg_split(字符串 $pattern, 字符串 $subject[, 整数 $limit[, 整数 $flags]]) 因为我们分离出来的 HTML 标签内容还需要在以后的步骤中继续使用,因此我们书写了以下的函数来同时获取 HTML 标签内容和正文内容:
复制内容到剪贴板
代码:
/**
* 将指定内容按 HTML 标签分离
* @param 字符串 $context 需要切分的内容
* @return 数组 返回由被切分以后的内容单元组成的数组,如果内容为空,则返回一个仅包括一个空字符元素的数组。
**/
function getSplittedContext($context)
{
if (TRUE == empty($context)) return array('');
else return preg_split('/(<[^>]+?>)/', $context, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
}在分离 HTML 标签以后呢,我们就需要在非 HTML 标签的内容搜索关键字,如果找到关键字就将其标注出来。在这一个过程中,我们最适合使用的是 PHP 函数 preg_replace()。
preg_replace 的原型:
复制内容到剪贴板
代码:
混合值 preg_repllace(混合值 $pattern, 混合值 $replacement, 混合值 $subject[, 整数 $limit[, 整数 &$count]]) 因为我们的关键字不仅仅是一个,因此我们计划向 preg_replace() 的第一个参数传递一个关键字列表。为了达到这个目的,我们在函数的开始首先就构造了一个多个选项匹配的正则表达式。
复制内容到剪贴板
代码:
function replaceKeywords($splited_context, $keywords)
{
// 多个选项匹配的正则表达式
$pattern = '';
// 组合内容
$context = '';
// 如果关键字列表为空,则直接返回正文内容
if (TRUE == empty($keywords)) return implode('', $splited_context);
foreach ($keywords as $key => $value) $pattern .= '|' . $key;
// 去掉生成的表达式第一个字符(|)
$pattern = '/(' . substr($pattern, 1) . ')/';
// 遍历切分后的内容
for ($i = 0; $i < count($splited_context); $i++)
{
if (
TRUE == empty($splited_context[$i]) // 如果该单元内容为空
|| ('<' == substr($splited_context[$i], 0, 1) && '>' == substr($splited_context[$i], -1)) // 如果该单元内容为 HTML 标签。注意这里:我们为了考虑效率,仅仅检查了单元内容的第一个字符和最后一个字符
)
{
$context .= $splited_context[$i];
continue;
}
else $context .= preg_replace($pattern, '<a href="$1">$1</a>', $splited_context[$i]);
}
return $context;
}这样,我们就构造出了我们的基本核心代码。接下来呢,我们就需要在我们的基本核心基础上制造出真正可供使用的分析内容方法。
本文所有权属于
hi-open.cn,转载时请注明转载出处。