#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 по длине ключа, что позволит избежать замены более короткой строки перед длинной строкой.