Ching Ching
Ching Ching

Reputation: 1049

PHP preg_replace multiple words

I have a problem when replacing strings with preg_replace.

function addClass($search, $string) {

    return preg_replace("/\b($search)\b/", "<div class=mark>$1</div>", $string);

}

$string = "We won again"; 
$result  = addClass("We", $string);

output ---> <div class=mark>We</div> won again

I want to make $search for multiple strings.

$string = "We won again"; 
$result  = addClass(array("We", "again"), $string);

output ---> <div class=mark>We</div> won <div class=mark>again</div>

How can I create multiple searches, to put strings in an array?

Thanks in advance.

Upvotes: 0

Views: 2330

Answers (2)

splash58
splash58

Reputation: 26153

You can use or expresion in regex - (We|again)

function addClass($search, $string) {
    return preg_replace("/\b(". implode('|', $search) . ")\b/", "<div class=mark>$1</div>", $string);
}

And, if you want to save the old syntax, make an array from a single string:

function addClass($search, $string) {
    if(! is_array($search)) $search = array($search);
    return preg_replace("/\b(". implode('|', $search) . ")\b/", "<div class=mark>$1</div>", $string);
}

demo

Upvotes: 3

RomanPerekhrest
RomanPerekhrest

Reputation: 92894

The alternative solution using is_array and array_map functions:

function addClass($search, $string) {
    $search = (is_array($search))? array_map(function($v) { return "/\b($v)\b/"; }, $search) : ["/\b($search)\b/"];
    return preg_replace($search, "<div class=mark>$1</div>", $string);
}

Upvotes: 2

Related Questions