【问题标题】:ColdFusion: rereplace xml formatted html-tags regexColdFusion:替换 xml 格式的 html-tags 正则表达式
【发布时间】:2012-12-05 14:08:15
【问题描述】:

我找到了一个可行的解决方案来删除所有 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") />

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

【问题讨论】:

  • 应该 &lt;cfset test = rereplace(blah, "&amp;lt;h2[^&gt;]*&amp;gt;", "&lt;title_2&gt;", "ALL") /&gt;&lt;cfset test = rereplace(blah, "&amp;lt;h2[^&amp;gt;]*&amp;gt;", "&lt;title_2&gt;", "ALL") /&gt;
  • 我试过这个,但它不匹配......
  • 当前代码中#test# 的实际值是多少?
  • 我认为是因为 [^ 只匹配单个字符,而您却很想匹配 4。
  • 我认为test = rereplace(blah, "&amp;lt;h2[^&amp;]*&amp;gt;", "&lt;title_2&gt;", "ALL") /&gt; 会起作用。我的测试等于&amp;lt;h1&amp;gt;title 1&amp;lt;/h1&amp;gt;&lt;title_2&gt;title 2&amp;lt;/h2&amp;gt;&amp;lt;h3&amp;gt;test&amp;lt;/h3&amp;gt;

标签: xml regex coldfusion replace ampersand


【解决方案1】:

格式化 XML 后不能使用 &gt;,因为该字符不再存在于文本中的任何位置。

这将匹配/替换开始的 h2 标签,而不是结束的标签:

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

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

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

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

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

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

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

【讨论】:

  • 就是这样......我已经认为,正则表达式不是最好的解决方案。但由于我想不出另一种解决方案,而且这似乎是最简单的方法,我将使用您的代码。谢谢!
  • 是的,它正在工作!首先使用 XMLFormat() 函数是否是一个糟糕的解决方案,而不是更改标签(如上),而不是在 &lt;cfxml&gt; 中将缺少的实体添加到文档类型中?...
  • 不完全确定你在问什么,但总的来说我更喜欢获得一个 DOM,根据需要更改标签,然后输出回字符串。取决于源文本的来源以及您实际上想用它做什么?
  • 使用 DOM 很容易上手。 XmlParse 是它的内置方法,(虽然可能有点费力)。还有诸如jSoupTagSoup 之类的工具,它们提供了更方便的遍历/操作方式——Ben Nadel 在他的博客上有关于它们的文章。
  • 谢谢。实际的项目相当小,我认为实际的代码可以完成这项工作。但我会在未来和更大的项目中记住这一点。
【解决方案2】:
<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") />

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

【讨论】:

  • “我认为[^ 部分可以防止它变得贪婪。” - 不,^ 只是表示字符类被否定 - 所以它匹配除 & 之外的每个字符,但仍然如此贪婪。 (但是,这通常是比非贪婪的.*?&amp; 更好的方法。
  • 只有在不涉及其他实体的情况下才有效 - 如果 XML 被完全转义,那么 " 将是 &amp;quot; 并且这将失败 - 请参阅我的答案以了解如何处理用那个。
  • 我想我会在这里见到你的,彼得。谢谢指正。
猜你喜欢
  • 2012-11-02
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多