【问题标题】:Never ending do-while loop with regex使用正则表达式永远不会结束 do-while 循环
【发布时间】: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' => "&#8239;"
            );
        $patterns[2] = array(
            'find' => "/[«‹]\K(?!\p{Zs})/imu",
            'repl' => "&#8239;"
            );

模式 1 应该与上面的 trans-unit 1 匹配,而模式 2 应该与 trans-unit 2 匹配。模式 1 工作正常,但如果我运行模式 2(仅运行或同时运行),循环永远不会结束。替换基本上是用狭窄的分隔空间替换 « 或 ‹(模式 1)之后的正常(分隔)空格,或者在根本没有空格时插入它(模式 1)。

我想说这个问题与第二个正则表达式有关,但我不知道那个表达式有什么问题。有什么建议吗?

【问题讨论】:

  • 有时人们会在他们的问题中添加示例数据......
  • 抱歉,我认为这无关紧要。现在添加,谢谢!
  • 与问题无关,但用法语写成saucisse
  • 我做了一个非常错误的假设:我的模式 \p{Zs} 将匹配 &amp;#8239;,但事实并非如此。添加“ ”到 muy 模式 2(即'find' =&gt; "/[«‹]\K(?!\p{Zs}|&amp;#8239;)/imu",)似乎解决了这个问题。谢谢。
  • 我无法发布答案,因此我无法将问题投票为已解决。

标签: php regex do-while pcre regex-lookarounds


【解决方案1】:

\p{Zs} 模式与&amp;#8239; 不匹配,因此将&amp;#8239; 添加到第二个模式的前瞻条件中:

'find' => "/[«‹]\K(?!\p{Zs}|&#8239;)/iu",) 
                            ^^^^^^^           

【讨论】:

  • 没错,正如我在 11 月 17 日在 cmets 上发布的那样。谢谢,维克托 :)
猜你喜欢
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多