使用php和regex将时间戳更改为短代码

时间:2016-02-19 12:24:33

标签: php regex

这是内容。

2:00

10:00

03:00

1时04分01秒

1时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和regex。

$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生成此shortocde意味着跳过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"

一起使用

1 个答案:

答案 0 :(得分:1)

这是因为替换功能。当你到达索引4(1:04:01)时,你正在替换' 1:04:01'在原始字符串中。它正在重播' 01:04:01'以及0被拒之门外。

您的问题没有解释为什么需要使用str_replace执行替换。您可以在正则表达式中使用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)

请告诉我这是否符合您的预期。