Замените слова, найденные в строке, выделенным словом, сохраняя их случай как найденный

Я хочу заменить слова, найденные в строке, выделенным словом, сохраняя их случай как найденный.

пример

$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 цветов

Как это можно сделать?

Solutions Collecting From Web of "Замените слова, найденные в строке, выделенным словом, сохраняя их случай как найденный"

Чтобы выделить одно слово без учета регистра

Используйте 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)