0

私は2本の弦を持っています

  $xml = '<para aid:pstyle="NL_FIRST">—To the best of our knowledge, the MMSN<emph aid:cstyle="ITALIC"> protocol</emph> is the first multifrequency<emph aid:cstyle="ITALIC"> MAC protocol especially</emph> designed for WSNs, in which each device is equipped with a single radio transceiver and the MAC layer packet size is very small.</para></item><item>';
  $tex = '\begin{itemize}\item o the best of our knowledge, the MMSN protocol is the first multifrequency MAC protocol especially designed for WSNs, in which each device is equipped with a single radio transceiver and the MAC layer packet size is very small.\item';

<emph aid:cstyle="ITALIC"> protocol</emph>この種のタグを見つけて、同じテキストを見つけて、単語を$texに置き換える必要があります 。"protocol"{it protocol }

単に

私はこのパターンを見つける必要があります

<emph aid:cstyle="ITALIC"> protocol</emph>

そのパターン内のテキストを見つけて、$tex 内の同じ単語を置き換えます。

$tex参考までに: 内容的にはどちらも同じ$xmlです。

このコードを使用しました

  preg_match_all('/<emph aid:cstyle="ITALIC">(.*?)<\/emph>(.*?)\</',$xml,$matches);

  for($i=0;$i<count($matches[1]);$i++)
   {

    $findtext = str_replace("<","",$matches[1][$i].$matches[2][$i]);    

$replace  = "{\it".$matches[1][$i]."}".$matches[2][$i];

$finaltext = preg_replace('/'.$findtext.'/',$replace,$tex);

    }

     echo $finaltext;

しかし、それは1つだけを置き換えます。

4

1 に答える 1

1

正規表現を次のように変更する必要があります

preg_match_all('/<emph aid:cstyle="ITALIC">(.+?)<\/emph>/', $xml, $matches);

サンプル文字列で試してみたところ、両方が見つかりました。

現在の正規表現は、文字列の多くを消費します。提供された文字列で実行すると、意図した以上に一致することがわかります

string(71) "<emph aid:cstyle="ITALIC"> protocol</emph> is the first multifrequency<"

次の「<」はすでに一致しているため、マッチャーは次の開始タグを見つけることができません。

ループ部分の場合: $tex を上書きしていませんが、作業する文字列として使用しています。そのため、最後の変更以外は保存されません。

$finaltext = $tex;
for ($i = 0; $i <count($matches[1]); $i++) {
    $finaltext = str_replace($matches[1][$i], '{\it'.$matches[1][$i].'}', $finaltext);
}
echo $finaltext;
于 2012-05-30T19:54:28.033 に答える