2016-11-17 8 views
1

XLIFFファイルで一連のパターンを実行しようとしています。サンプル:正規表現でdo-whileループを終了しない

<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); 
     } 
    } 

、Iはpattersの配列を有する:

 $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)挿入します。

私は問題が2番目の正規表現と関係していると言いますが、その表現に何が間違っているのか分かりません。任意のヒント?

+0

は時々の人々は申し訳ありませんが、私は思うdid't – Andreas

+0

....彼らの質問にサンプルデータを追加しますそれは関連するだろう。今追加されました、ありがとう! – msoutopico

+0

質問には何もしませんが、フランス語では 'saucisse'と書かれています – Toto

答えて

1

\p{Zs}パターンは、したがって、第二のパターンで先読み条件に&#8239;を追加し、&#8239;と一致していません:

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

まさに、11月17日のコメントに投稿したとおりです。Thans、Wiktor :) – msoutopico

関連する問題