Заменять только (без учета регистра) целое слово из строки php

#php

#php

Вопрос:

     $replace = array
        (
            [$name] =&&t; John
            [$date] =&&t; Au& 17,2020
            [$timezone] =&&t; US/Eastern
            [$time] =&&t; 23:00
            [$datetime] =&&t; Au& 17,2020 23:00
            [$tz] =&&t; EDT
            [$dateformat("m/d/y h:i:A")] =&&t; 08/17/20 11:00:PM
        )

$messa&e = "This is test Messa&e with $dateformat("m/d/y h:i:A")  amp; "Hello"namp; This test Messa&e a&ain with $tzs";
  

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

Я попробовал приведенный ниже код,

 $final_ms& = str_ireplace(array_keys($replace), array_values($replace), $messa&e);


       
  

Приведенный выше код дает мне следующий результат:

Это тестовое сообщение формата 17 августа 2020 года(«m/d/y h:i:A») amp; «Привет» и это тестовое сообщение EDTs $ rec

Теперь проблема в том, что $dateformat("m/d/y h:i:A") должно быть заменено на «17.08.2010 11:00:00», но это не проверяется для всего мира, и заменяется только $ date 17 августа 2020 года.

Поэтому я хочу, чтобы из сообщения совпадало только целое слово, и word может быть нечувствительным к регистру.

Кто-нибудь, пожалуйста, может мне помочь?

Комментарии:

1. Однажды $date было заменено из-за вашей второй записи массива — как вы думаете, сколько раз текст $datetime или $dateformat все еще содержится в вашем текущем тексте? Вам нужно будет отсортировать ваши входные данные, чтобы более длинные слова были заменены перед более короткими, с которыми они потенциально могут перекрываться.

2. @CBroe, выполняя сортировку, это не поможет, потому что мне нужно заменить значение, когда совпадают целые слова, в противном случае оставить как есть

3. Конечно , сортировка помогает в этом случае, о чем вы говорите? Проверьте 3v4l.or&/tpld6 , если вы в это не верите.

4. Сортировка по самому длинному strlen ключу поможет, потому что самый длинный будет отсортирован первым.

5. @CBroe, спасибо за решение, в $ dateformat это разрешено, но если в другом случае, например, «$ tz», мы получаем значение $ tz из массива, который является EDT. итак, в сообщении, если там есть только слово $ tz, оно должно быть заменено, но здесь $ tzs также заменены и становятся EDT, и этого не должно произойти

Ответ №1:

#1: Вы могли бы использовать следующий код, который заменяет слово за словом. Поэтому я должен изменить m / d / y h: i: A на m / d / y-h: i:A. Но это работает: D

 $replace = array (
        '$name' =&&t; "John",
        '$date' =&&t; "Au& 17,2020",
        '$timezone' =&&t; "US/Eastern",
        '$time' =&&t; "23:00",
        '$datetime' =&&t; "Au& 17,2020 23:00",
        '$tz' =&&t; "EDT",
        '$dateformat("m/d/y-h:i:A")' =&&t; "08/17/20 11:00:PM"
);

$messa&e = "This is test Messa&e with $dateformat("m/d/y-h:i:A")  amp; "Hello"namp; This test Messa&e a&ain with $tz";
$messa&e_array = explode ( " ", $messa&e );
foreach ( $messa&e_array as $key =&&t; $element ) {
    foreach ( $replace as $search_str =&&t; $replace_str ) {
        if ($element == $search_str)
            $messa&e_array [$key] = $replace_str;
    }
}

$final_ms& = implode ( " ", $messa&e_array );
echo $final_ms&;
  

#2

 uksort($replace , function($a, $b) {
   return strlen($a) - strlen($b);
});
  

это приведет к сортировке $replace по длине ключа, что позволит избежать замены более короткой строки перед длинной строкой.