xml 中带有回车 returns 的文本的正则表达式模式

Regex pattern for a text with carriage returns in xml

在 xml 文件中,我想更改内容,以便列名成为标签而不是属性。

<column name="bla">some text</column>

应该变成:

<bla>some text</bla>

我得到了这个 partialy 使用以下正则表达式:

regex:        <column name="(.*)">(.*)<\/column>
substitution: <></>

但是当文本中包含回车returns时,这是不够的。添加 [\r\n]* 也只能部分帮助。对此有什么想法吗?

它应该可以解决这个问题:

<column name="bla">some text</column>
<column name="bla">some text
</column>
<column name="bla">some text
        </column>
<column name="bla">some text
some text</column>
<column name="bla">some text
some text
some text</column>

成为:

<bla>some text</bla>
<bla>some text
</bla>
<bla>some text
        </bla>
<bla>some text
some text</bla>
<bla>some text
some text
some text</bla>

我建议你使用 xml 解析器来完成这项工作,或者创建一个 XSLT 样式表以节省时间和将来的问题(编写你正在使用的语言来完成这项工作工作,以便我们可以向您推荐一些东西)。

无论如何,您的正则表达式不起作用,因为点 . 需要 DOTALL 修饰符 (?s) 才能匹配(newline/carriage return 也)。

<column\s+name="([^"]+)"\s*>(.*?)<\/column>

.* 之后的惰性修饰符 ? 也是必需的:如果缺少正则表达式 (.*?) 匹配从第一个开始标签 <column> 到最后一个结束标签 </column>.

在线尝试正则表达式here

更新 - PHP

$pattern = '~(?s)<column\s+name="([^"]+)"\s*>(.*?)<\/column>~';
$text = "<column name=\"bla\">some text</column>\n<column name=\"bla\">some text\n</column>\n<column name=\"bla\">some text\n        </column>\n<column name=\"bla\">some text\nsome text</column>\n<column name=\"bla\">some text\nsome text\nsome text</column>";

$result = preg_replace($pattern, "<></>", $text);