使用数组用英语月份名称替换冰岛月份名称

时间:2018-07-02 04:37:38

标签: php arrays regex date datetime

我有一些日期变量包含冰岛的月份名称,例如:

$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个字符。

因此,如果数组中这些值的一部分存在于date变量中,则将其替换为英语月份。

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);
}

我不知道日期格式中英文和冰岛月份的缩写形式。

1 个答案:

答案 0 :(得分:1)

代码:(Demo

$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

这是逻辑:

您的查找数组必须具有:

  1. 包含前三个小写冰岛字母(带有重音符号)的键
  2. 包含所需英语月份名称的值(我使用的是完整的月份名称)

preg_replace_callback()将被使用,因为功能过程将应用于每个匹配项。

该模式由与|绑定在一起的所有查找键组成(代表OR逻辑)。前三个字符存储在捕获组#1中。可选的结尾字母由\pL*匹配,i是“任何字母”的Unicode安全版本。 u模式修饰符允许不区分大小写的匹配。 $m[1]修饰符允许Unicode字符匹配。

第一个捕获组($m[0])将转换为(多字节安全)小写字母,然后用于从查找数组访问所需值,该数组将替换“全字符串”匹配项(for child in raw_quality: grade = child.find(class_ = 'grade').get_text() )这样就不会保留任何原始的冰岛语单词。