Бесконечный цикл с регулярным выражением

Я пытаюсь запустить серию паттернов в файле 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 должна соответствовать транс-единице 1 выше, а шаблон 2 должен соответствовать транс-единице 2. Шаблон 1 работает нормально, но если я запускаю шаблон 2 (только или оба), цикл никогда не заканчивается. Замена в основном заменяет нормальный (разрывный) пробел после «или‹ (шаблон 1) на узкий разрывный интервал или вставляет его, если пробела вообще нет (шаблон 1).

Я бы сказал, что проблема связана со вторым регулярным выражением, но я не могу понять, что не так с этим выражением. Какие-нибудь советы?

1

Решение

\p{Zs} шаблон не соответствует &#8239;поэтому добавить &#8239; к условию ожидания во втором паттерне:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]