使用 php 和正则表达式将时间戳更改为简码


Change timestamp into shortcode using php and regex

这是内容。

2:00

10:00

03:00

1:04:01

01:

04:01

所以上面的时间戳应该变成短代码,例如

[spp-timestamp time="(timestamp)"]

但不应触及现有的短代码

如下所示

[spp-timestamp time="1:05:01"]

[spp-timestamp time="01:05:01"]

[spp-timestamp time="4:00"]

[spp-timestamp time="15:00"]

[spp-timestamp time="05:00"]

这是我使用 php 和正则表达式的内容。

$pattern= '/(?!["''])'b'd{1,2}:'d{2}(?::'d{2})?'b(?!["''])/';
           preg_match_all($pattern,$content, $matches); 
                foreach ($matches[0] as $time){     
                         $shortcode = '[spp-timestamp time="'.$time. '"]';
                         $content = str_replace($time, $shortcode, $content);
                }
         }

这是我得到的结果。

Array ( [0] => Array ( [0] => 2:00 [1] => 10:00 [2] => 03:00 [3] => 1:04:01 [4] => 01:04:01 [5] => 1:05 [6] => 01:05 ) ) 
    [spp-timestamp time="2:00"]
    [spp-timestamp time="10:00"]
    [spp-timestamp time="03:00"]
    [spp-timestamp time="1:04:01"]
    0[spp-timestamp time="1:04:01"]

    Shortcode:
    [spp-timestamp time="[spp-timestamp time="1:05"]:01"]
    [spp-timestamp time="0[spp-timestamp time="1:05"]:01"] 
    [spp-timestamp time="4:00"] 
    [spp-timestamp time="15:00"] 
    [spp-timestamp time="05:00"] 

不知道为什么它从短代码中选择时间:(

此外,生成此短字符的时间戳 01:04:01 意味着跳过 ZERO。

0[spp-timestamp time="1:04:01"]

更新

我想我明白为什么它从短代码中选择时间。

正则表达式有问题

(?!["'])'b'd{1,2}:'d{2}:'d{2}'b(?!["'])

我在正则表达式方面没有太多经验。

以上用于选择没有报价市场的时间戳,但它仅适用于 MM:SS 而不是 HH:MM:SS

例如"2:00

",但它不适用于"

00:00:00"

这是因为替换函数。当您到达索引 4 (1:04:01) 时,您将替换原始字符串中的"1:04:01"。它也在重新定位"01:04:01",并且 0 被排除在外。

您的问题没有解释为什么需要执行替换为str_replace。您可以在正则表达式本身中使用替换方法。

使用preg_replace查找和替换。

我不确定输入,但假设它是文本。所以下面是你的代码

$text = "2:00 10:00 3:00  1:04:01 01:04:01";
$replacement = 'spp-timestamp time="${1}"';
$matches = preg_filter ('/(?!["''])'b('d{1,2}:'d{2})(?::'d{2})?'b(?!["''])/',$replacement, $text);
print_r($matches);

下面是输出:

string 'spp-timestamp time="2:00" spp-timestamp time="10:00" spp-timestamp time="3:00"  spp-timestamp time="1:04" spp-timestamp time="01:04"' (length=132)

让我知道这是否是您所期望的。