Preg_replace西里尔字母或短语 - 不是两者

时间:2013-05-28 11:59:46

标签: php regex preg-replace

我正在编写一个PHP函数,它应该将某些关键字转换为链接。它使用UTF-8中的西里尔字。 所以我想出了这个:

function keywords($text){

    $keywords = Db::get('keywords'); //array with words and corresponding links
    foreach ($keywords as $value){
        $keyword = $value['keyword'];
        $link = $value['link'];
        $text = preg_replace('/(?<!\pL)('.$keyword.')(?!\pL)/iu', '<a href='.$link.' class="linked">$1</a>', $text);
    }
    return $text;
}

到目前为止,这就像一个魅力,但现在我想用链接替换短语 - 可能包含其他关键字的短语。例如,我希望“汽车”这个词链接到一个地方,而“蓝色汽车”链接到其他地方。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

正如评论中所写,我将此作为答案发布,希望它对您有用。

您可以尝试首先使用占位符将关键字替换为文本,然后在解析整个文本时,可以用真实的单词替换这些占位符。

例如,请使用短语:

"I have a car, a blue car." 

我们已经将关键字列表从较长的订购到较小的订单,因此我们检查“蓝色汽车”;我们在文本中找到它,因此我们将占位符放入并获取:

"I have a car, a [[1]]." 

列表中的第二个关键字是“car”;在文本中替换后,我们获得:

"I have a [[2]], a [[1]]." 

最后,当所有关键字都被替换后,您只需使用函数中的preg_replace替换其顺序中的占位符,并获取带有链接的文本。