php str_ireplace без потери дела

можно ли запустить str_ireplace без разрушения исходного корпуса?

Например:

$txt = "Hello How Are You";
$a = "are";
$h = "hello";
$txt = str_ireplace($a, "<span style='background-color:#EEEE00'>".$a."</span>", $txt);
$txt = str_ireplace($h, "<span style='background-color:#EEEE00'>".$h."</span>", $txt);

все это работает нормально, но результат выводит:

[hello] How [are] You

вместо:

[Hello] How [Are] You

(квадратные скобки — цвет фона)

Спасибо.


person FoxyFish    schedule 24.05.2013    source источник
comment
Также я хотел бы добавить, что причина, по которой я использую ireplace, заключается в том, что я хочу, чтобы он менялся даже в нижнем регистре, но если в верхнем регистре, я хочу, чтобы он сохранял свою заглавную.   -  person FoxyFish    schedule 24.05.2013
comment
внутренне str_ireplace преобразует $search и $replace в нижний регистр для поиска совпадений - это не ответ, но объясняет, почему у вас возникла проблема   -  person naththedeveloper    schedule 24.05.2013


Ответы (3)


Вы, вероятно, ищете это:

$txt = preg_replace("#\\b($a|$h)\\b#i", 
  "<span style='background-color:#EEEE00'>$1</span>", $txt);

... или, если вы хотите выделить весь массив слов (с возможностью использования метасимволов):

$txt = 'Hi! How are you doing? Have some stars: * * *!';
$array_of_words = array('Hi!', 'stars', '*');

$pattern = '#(?<=^|\W)(' 
       . implode('|', array_map('preg_quote', $array_of_words))
       . ')(?=$|\W)#i';

echo preg_replace($pattern, 
      "<span style='background-color:#EEEE00'>$1</span>", $txt);
person raina77ow    schedule 24.05.2013
comment
@user1483508 user1483508 Обратите внимание, что ваш исходный код из вопроса также работает. И именно поэтому вы не должны не использовать preg_replace(), так как он медленнее. Не понимаю, в чем проблема на самом деле - person hek2mgl; 24.05.2013
comment
@ hek2mgl: Это потому, что мне нужно, чтобы он работал с прописными, строчными и смешанными буквами, не меняя его на строчные в выводе. - person FoxyFish; 24.05.2013
comment
Код, который вы разместили, выведет ожидаемые результаты. Пожалуйста, покажите, каков ваш текущий результат и каков ожидаемый результат. - person hek2mgl; 24.05.2013
comment
Может кто-нибудь сказать мне, что мне здесь не хватает? - person hek2mgl; 24.05.2013
comment
Вы ничего не упускаете, проблема была решена с первым постом. Я думаю, что я просто неправильно сформулировал свой первоначальный пост для некоторых людей. - person FoxyFish; 24.05.2013
comment
@ hek2mgl Я, наверное, смогу. ) Смысл OP в том, чтобы обернуть как «привет», так и «HELLO» в «Hello», это пример строки «HELLO hello». str_ireplace заменит их оба одним вариантом строки «привет» — либо в верхнем, либо в нижнем регистре. - person raina77ow; 24.05.2013
comment
Спасибо за объяснение. В настоящее время я все еще не понимаю. Позже все перечитаю, иногда помогает ;) - person hek2mgl; 24.05.2013
comment
@hek2mgl Посмотрите эту демонстрацию, возможно, она тоже поможет. ) - person raina77ow; 24.05.2013
comment
Понятно! :) Благодарность! +1 (уже проголосовал за ваш пост, не могу дважды;) - person hek2mgl; 24.05.2013
comment
Вы можете просто делать то, что делаете, а затем ucwords($result) вывод - person Bysander; 07.07.2015

Я думаю, вы хотели бы что-то в этом роде: найти слово в том виде, в котором оно отображается, а затем использовать его для замены.

function highlight($word, $text) {
    $word_to_highlight = substr($text, stripos($text, $word), strlen($word));
    $text = str_ireplace($word, "<span style='background-color:#EEEE00'>".$word_to_highlight."</span>", $text);
    return $text;
}
person mhanson01    schedule 24.05.2013
comment
Спасибо, это то, что я тоже искал - person Solvision; 27.02.2016
comment
На самом деле у этого, похоже, проблема с несколькими вхождениями строки поиска, первый в порядке (сохраняется в исходном формате), но последующие преобразуются - person Solvision; 27.02.2016

Не красиво, но должно работать.

function str_replace_alt($search,$replace,$string)
{
    $uppercase_search = strtoupper($search);
    $titleCase_search = ucwords($search);
    $lowercase_replace = strtolower($replace);
    $uppercase_replace = strtoupper($replace);
    $titleCase_replace = ucwords($replace);

    $string = str_replace($uppercase_search,$uppercase_replace,$string);
    $string = str_replace($titleCase_search,$titleCase_replace,$string);
    $string = str_ireplace($search,$lowercase_replace,$string);

    return $string;
}
person user1122069    schedule 24.05.2013