user2423941
user2423941

Reputation: 41

Preg_replace cyrillic word or phrase - not both

I am writing a PHP function which is supposed to convert certain keywords into links. It uses Cyrillic words in UTF-8. So I came up with this:

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;
}

So far this runs like a charm, but now I want to replace phrases with links - phrases that may contain other keywords. For example I want the word "car" to link to one place, and "blue car" to other.

Any ideas?

Upvotes: 4

Views: 315

Answers (1)

Erenor Paz
Erenor Paz

Reputation: 3161

As written in the comment, i post this as an answer, hoping it's been useful to you.

You could try replacing the keyword into the text firstly by using a placeholder and then, when entire text has been parsed, you can substitute those placeholders with the real words.

For example, take the phrase:

"I have a car, a blue car." 

We already ordered the keywords list from longer to smaller, so we get to check "blue car"; We find it in the text, so we put the placeholder and obtain:

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

The second keyword in the list is "car"; after substitution in the text, we obtain:

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

Finally, when all keywords have been substituted, you only have to replace the placeholders in their order using the preg_replace in your function, and get the text with links.

Upvotes: 1

Related Questions