PHP中正常匹配的正则在JavaScript中仅匹配首个目标问题排查
问题解答:正则替换在PHP与JavaScript中的行为差异
核心原因:正则全局匹配标志的差异
- PHP的
preg_replace函数默认会全局替换所有匹配项,无论正则表达式是否带有全局修饰符,都会遍历整个字符串替换所有符合规则的内容。 - JavaScript的
String.replace()方法,当正则表达式没有添加g(global)标志时,只会替换第一个匹配到的内容;只有添加g标志,才会全局替换所有匹配项。
你的问题就出在JavaScript的正则没有添加g标志,导致只替换了第一个时间的点。
修正方案
在JavaScript的正则表达式末尾添加g标志,修改后的正则为:
/(\d{2}):(\d{2}):(\d{2})\.(\d{3})/g
代码对比示例
PHP 代码(正常全局替换)
$text = "00:00:01.000 --> 00:00:02.000\nALFRED, NOČNI ČUVAJ"; $pattern = '/(\d{2}):(\d{2}):(\d{2})\.(\d{3})/'; $replacement = '$1:$2:$3,$4'; $result = preg_replace($pattern, $replacement, $text); // 输出:00:00:01,000 --> 00:00:02,000\nALFRED, NOČNI ČUVAJ
JavaScript 错误代码(无g标志,仅替换第一个)
const text = "00:00:01.000 --> 00:00:02.000\nALFRED, NOČNI ČUVAJ"; const pattern = /(\d{2}):(\d{2}):(\d{2})\.(\d{3})/; const replacement = '$1:$2:$3,$4'; const result = text.replace(pattern, replacement); // 输出:00:00:01,000 --> 00:00:02.000\nALFRED, NOČNI ČUVAJ
JavaScript 正确代码(加g标志,全局替换)
const text = "00:00:01.000 --> 00:00:02.000\nALFRED, NOČNI ČUVAJ"; const pattern = /(\d{2}):(\d{2}):(\d{2})\.(\d{3})/g; const replacement = '$1:$2:$3,$4'; const result = text.replace(pattern, replacement); // 输出:00:00:01,000 --> 00:00:02,000\nALFRED, NOČNI ČUVAJ
内容的提问来源于stack exchange,提问作者LimetaPeta
相关产品推荐
相关产品推荐

