【发布时间】:2016-11-17 14:34:31
【问题描述】:
我正在尝试在 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 应该与上面的 trans-unit 1 匹配,而模式 2 应该与 trans-unit 2 匹配。模式 1 工作正常,但如果我运行模式 2(仅运行或同时运行),循环永远不会结束。替换基本上是用狭窄的分隔空间替换 « 或 ‹(模式 1)之后的正常(分隔)空格,或者在根本没有空格时插入它(模式 1)。
我想说这个问题与第二个正则表达式有关,但我不知道那个表达式有什么问题。有什么建议吗?
【问题讨论】:
-
有时人们会在他们的问题中添加示例数据......
-
抱歉,我认为这无关紧要。现在添加,谢谢!
-
与问题无关,但用法语写成
saucisse -
我做了一个非常错误的假设:我的模式
\p{Zs}将匹配&#8239;,但事实并非如此。添加“ ”到 muy 模式 2(即'find' => "/[«‹]\K(?!\p{Zs}|&#8239;)/imu",)似乎解决了这个问题。谢谢。 -
我无法发布答案,因此我无法将问题投票为已解决。
标签: php regex do-while pcre regex-lookarounds