这是内容。
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",但它不适用于"
这是因为替换函数。当您到达索引 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)
让我知道这是否是您所期望的。