У меня есть переменные даты, которые содержат названия исландских месяцев, например:
$date = '27. júní 2018 04:53';
Я хочу заменить эти названия месяцев на английские названия месяцев:
$icelandic = array('Janúar', 'Febrúar', 'Mars', 'Apríl', 'Maí', 'Júní', 'Júlí', 'Ágúst', 'September', 'Oktober', 'Nóvember', 'Desember');
Или ассоциативный массив:
$icelandic = array('Janúar' => '', 'Febrúar' => '', 'Mars' => '', 'Apríl' => '', 'Maí' => '', 'Júní' => '', 'Júlí' => '', 'Ágúst' => '', 'September' => '', 'Oktober' => '', 'Nóvember' => '', 'Desember' => '');
Как вы видите или знаете, названия месяцев - это не целое слово, а может быть только 3 или 4 символа от слова.
Итак, если часть этих значений в массиве существует в переменной даты, то она заменяется английским месяцем.
Замененные английские месяцы могут стать всем миром, поскольку new DateTime() справляется с этим.
Таким образом, указанная выше переменная может быть:
$date = '27. june 2018 04:53';
Или же :
$date = '27. jun 2018 04:53';
ОБНОВИТЬ:
Что я пробовал:
$icelandic = array('Janúar', 'Febrúar', 'Mars', 'Apríl', 'Maí', 'Júní', 'Júlí', 'Ágúst', 'September', 'Oktober', 'Nóvember', 'Desember');
$english = array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
for($i=0; $i < count($icelandic); $i++) {
$date = str_replace($icelandic[$i], $english[$i], $date);
}
Или сначала проверьте с помощью strpos():
if (strpos($icelandic[$i], $date)){
$date = str_replace($icelandic[$i], $english[$i], $date);
}
Я не знаю краткой формы даты в английском и исландском языках.
вы знаете каждую версию названия каждого месяца, которую нужно заменить?
@mickmackusa, я знаю, что это не бесплатная услуга кодирования, в своем вопросе я предоставил некоторую информацию о своих идеях. Может быть, я мог бы что-то сделать, но это может быть не лучшим способом и потребует много кода и времени выполнения. Это будет выполнено на реальном веб-сайте.
@mickmackusa, Также вы имеете право удалить свой ответ, я его не видел, но все равно спасибо.
Я поделился способами, с помощью которых, как я думаю, это можно сделать, используя массивы, два массива или один массив. Ключ - английский, а значение - исландское. Но что, если то, что я пробовал, сильно отличается от вашего ответа?
@mickmackusa, вопрос обновлен






Код: (Демо)
$icelandic = array(
'jan' => 'January',
'feb' => 'February',
'mar' => 'March',
'apr' => 'April',
'maí' => 'May',
'jún' => 'June',
'júl' => 'July',
'ágú' => 'August',
'okt' => 'October',
'sep' => 'September',
'nóv' => 'November',
'des' => 'December',
);
$tests = array(
'1. júní 2018 04:53',
'2. Ágú 2018 04:53',
'3. Maí 2018 04:53',
'4. nóvember 2018 04:53',
'5. Des 2018 04:53'
);
foreach ($tests as $test) {
echo "\n$test -> ";
echo preg_replace_callback('~(' . implode('|', array_keys($icelandic)) . ')\pL*~iu', function($m)use($icelandic) {
return $icelandic[mb_strtolower($m[1], 'UTF-8')];
}, $test);
}
Выход:
1. júní 2018 04:53 -> 1. June 2018 04:53
2. Ágú 2018 04:53 -> 2. August 2018 04:53
3. Maí 2018 04:53 -> 3. May 2018 04:53
4. nóvember 2018 04:53 -> 4. November 2018 04:53
5. Des 2018 04:53 -> 5. December 2018 04:53
Вот логика:
Ваш поисковый массив должен иметь:
preg_replace_callback() будет использоваться, потому что функциональные процессы будут применяться к каждому матчу.
Шаблон состоит из всех ключей поиска, связанных вместе с помощью | (для представления логики ИЛИ). Эти первые три символа хранятся в группе захвата №1. Необязательные завершающие буквы совпадают с \pL*, который является версией «любой буквы», безопасной для юникода. Модификатор шаблона i допускает сопоставление без учета регистра. Модификатор u позволяет сопоставление символов Юникода.
Первая группа захвата ($m[1]) будет преобразована в (многобайтовый) строчный регистр, а затем будет использоваться для доступа к желаемому значению из поискового массива, который заменит совпадение «полной строки» ($m[0]), так что ни одно из исходных исландских слов не останется.
Спасибо, я впервые вижу некоторые функции: D, но у меня вопрос: «Может ли $ test быть переменной, а не массивом?»
Определенно да. Именно так я показал универсальность решения.
Я бы хотел посмотреть, что вы пробовали до сих пор ....