【问题标题】:Replace Icelandic months names with English months names using an array使用数组将冰岛月份名称替换为英文月份名称
【发布时间】:2018-07-02 04:37:37
【问题描述】:

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

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

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

【问题讨论】:

  • 我想看看你到目前为止尝试了什么......
  • 您知道每个月名称的每个版本都需要替换吗?
  • @mickmackusa,我知道这不是免费的编码服务,我在我的问题中提供了一些关于我的想法的信息。也许我可以做点什么,但这可能不是我最好的方法,而且需要很多代码和执行时间。这将在真实网站上执行。
  • @mickmackusa,你也有权删除你的答案,我没看到,不过还是谢谢。
  • 我分享了我认为可以完成的方式,使用数组,两个数组或一个数组,关键是英语,值是冰岛语。但是,如果我尝试的与您的答案大相径庭呢?

标签: php arrays regex date datetime


【解决方案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 逻辑)。前三个字符存储在 Capture Group #1 中。可选的尾随字母由 \pL* 匹配,这是“任何字母”的 unicode 安全版本。 i 模式修饰符允许不区分大小写的匹配。 u 修饰符允许 unicode 字符匹配。

第一个捕获组 ($m[1]) 将转换为(多字节安全)小写字母,然后用于从查找数组中访问所需的值,该数组将替换“完整字符串”匹配项 ($m[0]),这样就没有原来的冰岛词将保留。

【讨论】:

  • 谢谢,我第一次看到一些函数 :D,但我有一个问题:'$test 可以是一个变量而不是一个数组吗?'
  • 是的,当然。这就是我展示解决方案多功能性的方式。
猜你喜欢
  • 2018-12-09
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2016-10-04
相关资源
最近更新 更多