Я хочу заменить слова, найденные в строке, выделенным словом, сохраняя их случай как найденный.
пример
$string1 = 'There are five colors'; $string2 = 'There are Five colors'; //replace five with highlighted five $word='five'; $string1 = str_ireplace($word, '<span style="background:#ccc;">'.$word.'</span>', $string1); $string2 = str_ireplace($word, '<span style="background:#ccc;">'.$word.'</span>', $string2); echo $string1.'<br>'; echo $string2;
Токовый выход:
Есть
five
цветов
Естьfive
цветов
Ожидаемый результат:
Есть
five
цветов
ЕстьFive
цветов
Как это можно сделать?
Используйте preg_replace()
со следующим регулярным выражением:
/\b($p)\b/i
Объяснение:
/
– начальный разделитель \b
– соответствие границе слова (
– начало первой группы захвата $p
– строка с экранированным поиском )
– конец первой группы захвата \b
– соответствие границе слова /
– конечный разделитель i
– модификатор шаблона, который делает поиск нечувствительным к регистру Шаблон замены может быть <span style="background:#ccc;">$1</span>
, где $1
является <span style="background:#ccc;">$1</span>
– он будет содержать то, что соответствовало первой группе захвата (которая в данном случае является фактической слово, которое было обыскано)
Код:
$p = preg_quote($word, '/'); // The pattern to match $string = preg_replace( "/\b($p)\b/i", '<span style="background:#ccc;">$1</span>', $string );
Смотрите это в действии
$words = array('five', 'colors', /* ... */); $p = implode('|', array_map('preg_quote', $words)); $string = preg_replace( "/\b($p)\b/i", '<span style="background:#ccc;">$1</span>', $string ); var_dump($string);
Смотрите это в действии
str_replace – чувствительность к регистру
str_ireplace – класс insenstive
http://www.php.net/manual/en/function.str-replace.php
http://www.php.net/manual/en/function.str-ireplace.php
Вот тестовый пример.
<?php class ReplaceTest extends PHPUnit_Framework_TestCase { public function testCaseSensitiveReplaceSimple() { $strings = array( 'There are five colors', 'There are Five colors', ); $expected = array( 'There are <span style="background:#ccc;">five</span> colors', 'There are <span style="background:#ccc;">Five</span> colors', ); $find = array( 'five', 'Five', ); $replace = array( '<span style="background:#ccc;">five</span>', '<span style="background:#ccc;">Five</span>', ); foreach ($strings as $key => $string) { $this->assertEquals($expected[$key], str_replace($find, $replace, $string)); } } public function testCaseSensitiveReplaceFunction() { $strings = array( 'There are five colors', 'There are Five colors', ); $expected = array( 'There are <span style="background:#ccc;">five</span> colors', 'There are <span style="background:#ccc;">Five</span> colors', ); foreach ($strings as $key => $string) { $this->assertEquals($expected[$key], highlightString('five', $string, '<span style="background:#ccc;">$1</span>')); } } } /** * @argument $words array or string - words to that are going to be highlighted keeping case * @argument $string string - the search * @argument $replacement string - the wrapper used for highlighting, $1 will be the word */ function highlightString($words, $string, $replacement) { $replacements = array(); $newwords = array(); $key = 0; foreach ((array) $words AS $word) { $replacements[$key] = str_replace('$1', $word, $replacement); $newwords[$key] = $word; $key++; $newwords[$key] = ucfirst($word); $replacements[$key] = str_replace('$1', ucfirst($word), $replacement); $key++; } return str_replace($newwords, $replacements, $string); }
Результаты
.. Time: 25 ms, Memory: 8.25Mb OK (2 tests, 4 assertions)