正则表达式 - 将内容从标记A移动到标记B.

时间:2014-12-19 10:14:54

标签: php regex xml

我需要帮助编写一个正则表达式,将标题标记中的内容移动到内容标记中。

此:

<xml>
 <item>
  <title>Title 1</title>
  <content>Text 1</content>
 </item>
 <item>
  <title>Title 2</title>
  <content>Text 2</content>
 </item>
</xml>

对此:

<xml>
 <item>
  <title>Title 1</title>
  <content>Title 1 Text 1</content>
 </item>
 <item>
  <title>Title 2</title>
  <content>Title 2 Text 2</content>
 </item>
</xml>

编辑:我提出了一个新主题,更好地解释了我的问题:Regular expression - moving content between XML tags

SORRY!

3 个答案:

答案 0 :(得分:0)

(<title>((?:(?!<\/title>).)*)<\/title>\s*<content>)((?:(?!<\/content>).)*)

试试这个。替换

$1$2 $3

参见演示。

https://regex101.com/r/vN3sH3/22

$re = "/(<title>((?:(?!<\\/title>).)*)<\\/title>\\s*<content>)((?:(?!<\\/content>).)*)/";
$str = "<xml>\n <item>\n <title>Title 1</title>\n <content>Text 1</content>\n </item>\n <item>\n <title>Title 2</title>\n <content>Text 2</content>\n </item>\n</xml>";
$subst = "$1$2 $3";

$result = preg_replace($re, $subst, $str);

答案 1 :(得分:0)

首先,使用正则表达式来解析domnode很糟糕,有些dom-parsers可以提供更好的帮助。 匹配标题标记内容的表达式:

带有最小标志的RegEx(非贪婪,非匹配的换行符):

\<title\>(.*)\</title\>

RegEx否则:

\<title\>([^\</title\>]*)\</title\> 

答案 2 :(得分:0)

使用DOTALL修饰符s在正则表达式中制作点以匹配换行符。

正则表达式:

~(<title>([^<>]*)<\/title>.*?<content>)~s

替换字符串:

\1\2 

DEMO

$re = "/(<title>([^<>]*)<\\/title>.*?<content>)/s";
$str = "<xml>\n <item>\n <title>Title 1</title>\n <content>Text 1</content>\n </item>\n <item>\n <title>Title 2</title>\n <content>Text 2</content>\n </item>\n</xml>";
$subst = "\1\2 ";
$result = preg_replace($re, $subst, $str);