2016-06-14 2 views
0

У меня проблема при замене строки на preg_replace.PHP 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 

Я хочу сделать $search для нескольких строк.

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

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

Как удержать многократный поиск строки, помещенной в массив?

заранее спасибо ...

ответ

2

Вы можете использовать or expresion в регулярном выражении - (We|again)

function addClass($search, $string) { 
    return preg_replace("/\b(". implode('|', $search) . ")\b/", "<div class=mark>$1</div>", $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

+0

, как использовать его? массив («мы», «выиграл») не работает –

+0

работающий - https://eval.in/588758 – splash58

+0

ahh, мой плохой. Я набираю «мы» вместо «Мы», как сделать регистр неприемлемым? –

2

Альтернативное решение с использованием is_array и array_map функции:

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