我有两个字符串
$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;
但它只取代了一个。
答案 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;