想根据一些关键字来 把一篇文章中包含这些关键字的地方加上超链接
比如提供关键字
'a','b','c'
文章内容如果是
" a is less than b test c"
替换之后会形成
<a href="test.php?word=a">a</a> is less than <a href="test.php?word=b">b</a> test <a href="test.php?word=c">c</a>从网上找了一个方法可以实现
function highlight_words($str, $words, $color = '#FFFF00')
{
if(is_array($words))
{
foreach($words as $k => $word)
{
$pattern[$k] = "/\b($word)\b/is";
$replace[$k] = '<a href="test.php?words='.$word.'">\\1</a>';
}
}
else
{
$pattern = "/\b($words)\b/is";
$replace = '<a href="test.php?words='.$words.'">\\1</a>';
}
return preg_replace($pattern,$replace,$str);
}
但是当我提供的关键字是短语的时候
比如关键字
" a is char","a is "
文章内容
" a is char ,b is char "
这样形成的链接就乱了
因为当关键字 a is char 的时候在上面加了一个链接 当处理到a is 的时候又在上面加了一个链接,
比如提供关键字
'a','b','c'
文章内容如果是
" a is less than b test c"
替换之后会形成
<a href="test.php?word=a">a</a> is less than <a href="test.php?word=b">b</a> test <a href="test.php?word=c">c</a>从网上找了一个方法可以实现
function highlight_words($str, $words, $color = '#FFFF00')
{
if(is_array($words))
{
foreach($words as $k => $word)
{
$pattern[$k] = "/\b($word)\b/is";
$replace[$k] = '<a href="test.php?words='.$word.'">\\1</a>';
}
}
else
{
$pattern = "/\b($words)\b/is";
$replace = '<a href="test.php?words='.$words.'">\\1</a>';
}
return preg_replace($pattern,$replace,$str);
}
但是当我提供的关键字是短语的时候
比如关键字
" a is char","a is "
文章内容
" a is char ,b is char "
这样形成的链接就乱了
因为当关键字 a is char 的时候在上面加了一个链接 当处理到a is 的时候又在上面加了一个链接,
文章内容
" a is char ,b is char "
最简单的办法不是改正则代码,而是更改关键词的替换顺序。先替换"a is ",然后再替换 " a is char" 就可以了。
结果是
<a href="test.php?words=<a href="test.php?words=a is">a is</a> char"><a href="test.php?words=a is">a is</a> char</a> ,b is char显示不正常
根据猜测,我觉得你是打算做一个文章系统上的关键词高亮这样的东西,关键词是存放在一个单独的表里面的,可以在后台添加关键词,我提到的这个select查找语句只需要在添加的时候执行一次而已,你总不可能每天都在疯狂的添加关键词吧?所以这个问题不大,另外我提到对每个关键词给予一个排序ID的问题,这个也是可以实现的,只需要在正则之前从数据读取关键词select的时候order by 下排序ID就可以了。最好是能够看到代码去改…… 不习惯打字。
我不会写php,贴段c#的给你,你就当伪代码用把。按我意思修改一下语言。
public string RegexBuilder(string[] words)
{
Array.Sort(words);//所有关键字按长度排序
Array.Reverse(words);//默认是最短的在前面,我们逆序排列,避免先检测短的
string exp = "";//定义变量记录正则表达式字符串
foreach(string w in words)//循环关键字字符串数组,组合正则表达式
{
exp += w+"|"//每个关键字被替换为 关键字| 这样的格式
}
exp.TrimEnd("|");//最后会多余一个,我们把最后的|删除
return exp;//返回正则表达式
}void RegexReplace(string[] words,string html)
{
string exp = RegexBuilder(words);
string result = Regex.Replace(html,exp,"<a href=\"test.php?word=$&\">$&</a>");
}这里result就是你要的结果了。你贴的代码。是把每个关键字都独立匹配,和不用正则一样了。我这个才是正则的用法。不过不懂PHP,只能写到这样了。
我不会写php,贴段c#的给你,你就当伪代码用把。按我意思修改一下语言。
public string RegexBuilder(string[] words)
{
Array.Sort(words);//所有关键字按长度排序
Array.Reverse(words);//默认是最短的在前面,我们逆序排列,避免先检测短的
string exp = "";//定义变量记录正则表达式字符串
foreach(string w in words)//循环关键字字符串数组,组合正则表达式
{
exp += w+"|"//每个关键字被替换为 关键字| 这样的格式
}
exp.TrimEnd("|");//最后会多余一个,我们把最后的|删除
return exp;//返回正则表达式
}void RegexReplace(string[] words,string html)
{
string exp = RegexBuilder(words);
string result = Regex.Replace(html,exp,"<a href=\"test.php?word=$&\">$&</a>");
}这里result就是你要的结果了。你贴的代码。是把每个关键字都独立匹配,和不用正则一样了。我这个才是正则的用法。不过不懂PHP,只能写到这样了。