正则表达式 - 将内容从标记A移动到标记B
问题描述:
我需要帮助编写一个将内容从标题标记移动到内容标记的正则表达式。正则表达式 - 将内容从标记A移动到标记B
此:
<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!通过
$1$2 $3
观看演示
答
(<title>((?:(?!<\/title>).)*)<\/title>\s*<content>)((?:(?!<\/content>).)*)
尝试this.Replace。
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);
答
首先,使用正则表达式解析domnodes是坏的,也有DOM的解析器,有助于更好。 表达式匹配的标题标签内容:
正则表达式用最少的标志(非贪婪,不匹配换行符):否则
\<title\>(.*)\</title\>
正则表达式:
\<title\>([^\</title\>]*)\</title\>
答
使用DOTALL
修改s
做出点在你的正则表达式中也可以匹配换行符。
正则表达式:
~(<title>([^<>]*)<\/title>.*?<content>)~s
替换字符串:
\1\2
$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);
是否需要是基于正则表达式的解决方案? – 2014-12-19 10:16:12
[不要使用正则表达式解析XML](http://stackoverflow.com/a/1732454/695343) – 2014-12-19 10:28:00
请勿复制您自己的问题。相反,编辑原来的一个。 - 我现在已经关闭了原来的问题,因为我已经关闭了重复的问题。你应该在你的问题中更清楚你已经尝试了什么,所以更确切地说明你确实有问题的部分。显示你自己的代码确实有助于在你的问题中更加清晰。 – hakre 2014-12-19 14:27:40