循环中的PHP str_replace

时间:2012-05-30 19:45:04

标签: php xml string for-loop

我有两个字符串

  $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 个答案:

答案 0 :(得分:1)

您应该将正则表达式更改为

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

我在您的示例字符串上尝试了它,它找到了两个。

您当前的正则表达式消耗了很多字符串。如果您在提供的字符串上运行它,您将看到它匹配的数量超出您想要匹配的数量

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

自下一个“&lt;”已匹配,匹配器无法找到下一个开始标记。

对于循环部分:您没有覆盖$ tex但是您正在使用它作为要处理的字符串。所以任何变化,但最后都不会存储。

$finaltext = $tex;
for ($i = 0; $i <count($matches[1]); $i++) {
    $finaltext = str_replace($matches[1][$i], '{\it'.$matches[1][$i].'}', $finaltext);
}
echo $finaltext;