1

我找到了一个可行的解决方案来删除所有 html-tags,如下所示:

<cfset test = rereplace(blah, "<h2[^>]*>", "", "ALL") />

在使用 XMLFormat() 格式化后,我需要生成一个 xml 文件并重命名一些标签。因此我尝试了以下方法:

<!--- example string --->
<cfset blah = '&lt;h1&gt;title 1&lt;/h1&gt;
               &lt;h2 style="color: black;"&gt;title 2&lt;/h2&gt;
               &lt;h3&gt;test&lt;/h3&gt;' />

<cfset test = rereplace(blah, "&lt;h2[^>]*&gt;", "<title_2>", "ALL") />

这会根据需要更改我的标签,但它不会停留在 > 部分?...我也尝试像这样逃避 & 符号\&lt;h2[^>]*\&gt;,但这似乎没有帮助。

4

2 回答 2

4

格式化 XML 后无法使用>,因为该字符不再存在于文本中的任何位置。

这将匹配/替换开始的 h2 标记,但不匹配结束标记:

<cfset test = blah.replaceAll('&lt;h2((?:[^&]+|&(?!gt))*)&gt;','<title_2$1>') />

其中的关键部分是:(?:[^&]+|&(?!gt))*

它匹配一个非 & 字符,或者一个 & 后面不跟gt, 直到它找到标签的结尾。

要更改您需要的整个标签:

<cfset test = blah.replaceAll('&lt;h2((?:[^&]+|&(?!gt))*)&gt;((?:[^&]+|&(?!lt;/h2))*)&lt;/h2&gt;','<title_2$1>$2</title_2>') />

这重复了与上面相同的概念,在将内容捕获到适当的组时也寻找结束 h2 标记。

在这个阶段,您开始进入正则表达式的领域,这可能不是这项工作的最佳工具——您可以在格式化之前使用 XML 解析器进行这些更改吗?

于 2012-12-05T14:43:21.830 回答
1
<cfset test = rereplace(blah, "&lt;h2[^>]*&gt;", "<title_2>", "ALL") /> 
<!--- there is no [^>] for you to match --->

应该

<cfset test = rereplace(blah, "&lt;h2[^&]*&gt;", "<title_2>", "ALL") />

我认为这[^部分可以防止它变得贪婪。

于 2012-12-05T14:42:39.577 回答