0

我有两个字符串

  $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;

但它只替换一个。

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 回答