永不结束使用正则表达式的 do-while 循环
Never ending do-while loop with regex
我正在尝试 运行 XLIFF 文件上的一系列模式。样本:
<trans-unit id="1">
<source> I like "sausages". </source>
<target> J'aime bien les « sausices » </target>
</trans-unit>
<trans-unit id="2">
<source> I like "sausages". </source>
<target> J'aime bien les «sausices» </target>
</trans-unit>
我解析文件,然后 运行 每个目标元素上的每个模式。
foreach($patterns as $p) {
if (preg_match($p['find'], $tu[0]->target, $dummy)) {
do {
$targetText = $tu[0]->target;
$tu[0]->target = preg_replace($p['find'], $p['repl'], $targetText, -1, $count);
} while ($count);
}
}
例如,我有一个带有模式的数组:
$patterns[1] = array(
'find' => "/[«‹]\K(?!\x{00A0})\s/imu",
'repl' => " "
);
$patterns[2] = array(
'find' => "/[«‹]\K(?!\p{Zs})/imu",
'repl' => " "
);
模式 1 应匹配上面的传输单元 1,模式 2 应匹配传输单元 2。模式 1 工作正常,但如果我 运行 模式 2(仅或两者)循环永远不会结束。替换基本上是在 « 或 ‹(模式 1)之后用一个窄的中断 space 替换正常(中断)space,或者如果根本没有 space(模式 1)则插入它。
我会说这个问题与第二个正则表达式有关,但我无法弄清楚该表达式有什么问题。有什么建议吗?
\p{Zs}
模式不匹配  
,因此在第二个模式的先行条件中添加  
:
'find' => "/[«‹]\K(?!\p{Zs}| )/iu",)
^^^^^^^
我正在尝试 运行 XLIFF 文件上的一系列模式。样本:
<trans-unit id="1">
<source> I like "sausages". </source>
<target> J'aime bien les « sausices » </target>
</trans-unit>
<trans-unit id="2">
<source> I like "sausages". </source>
<target> J'aime bien les «sausices» </target>
</trans-unit>
我解析文件,然后 运行 每个目标元素上的每个模式。
foreach($patterns as $p) {
if (preg_match($p['find'], $tu[0]->target, $dummy)) {
do {
$targetText = $tu[0]->target;
$tu[0]->target = preg_replace($p['find'], $p['repl'], $targetText, -1, $count);
} while ($count);
}
}
例如,我有一个带有模式的数组:
$patterns[1] = array(
'find' => "/[«‹]\K(?!\x{00A0})\s/imu",
'repl' => " "
);
$patterns[2] = array(
'find' => "/[«‹]\K(?!\p{Zs})/imu",
'repl' => " "
);
模式 1 应匹配上面的传输单元 1,模式 2 应匹配传输单元 2。模式 1 工作正常,但如果我 运行 模式 2(仅或两者)循环永远不会结束。替换基本上是在 « 或 ‹(模式 1)之后用一个窄的中断 space 替换正常(中断)space,或者如果根本没有 space(模式 1)则插入它。
我会说这个问题与第二个正则表达式有关,但我无法弄清楚该表达式有什么问题。有什么建议吗?
\p{Zs}
模式不匹配  
,因此在第二个模式的先行条件中添加  
:
'find' => "/[«‹]\K(?!\p{Zs}| )/iu",)
^^^^^^^