Я пытаюсь запустить серию паттернов в файле 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) на узкий разрывный интервал или вставляет его, если пробела вообще нет (шаблон 1).
Я бы сказал, что проблема связана со вторым регулярным выражением, но я не могу понять, что не так с этим выражением. Какие-нибудь советы?
\p{Zs}
шаблон не соответствует  
поэтому добавить  
к условию ожидания во втором паттерне:
'find' => "/[«‹]\K(?!\p{Zs}| )/iu",)
^^^^^^^
Других решений пока нет …