【问题标题】:replace a set of characters with another set of chars (in pair): "&", "&amp;" "<", "<" etc. in regex用另一组字符(成对)替换一组字符:正则表达式中的“&”、“&”、“<”、“<”等
【发布时间】:2009-03-03 13:07:47
【问题描述】:

我必须正确编码 5 个 XML 保留字符(& " 和 '),如下所示:

"&", "&amp;" "<", "&lt;" ">", "&gt;"
   "\"", "&quot;" "\'", "&apos;"

我可以一一做,但是在正则表达式中是否有可能像 ("[&||\"|\']", "&|

顺便说一句,可能在 Java 中使用 String.replaceAll(regexpString, string);

【问题讨论】:

    标签: java xml regex


    【解决方案1】:

    在 commons-lang 库中使用 StringEscapeUtils.escapeXml。

    顺便说一句,如果不将几乎所有的公共库添加到我的依赖项中,我从来不会启动 Java 进程。他们节省了很多时间..

    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.4</version>
    </dependency>
    

    【讨论】:

    • 这是我要找的那个 *

      例如:"bread" & "butter" => * &quot;bread&quot ; &amp; “黄油”。仅支持五种基本 XML 实体(gt、lt、quot、amp、apos)。

    【解决方案2】:

    查看代码http://www.owasp.org/index.php/How_to_perform_HTML_entity_encoding_in_Java

    Jakarta 也有一个常用的 escapeXml 方法可以覆盖它,但如果您要生成与 HTML 兼容的 XHTML,那些“&”实体是不可取的。

    当您只进行单字符替换时,IMO 的“同时”正则表达式并不能真正为您带来很多好处。

    【讨论】:

      【解决方案3】:

      如果您这样做是为了将一些数据插入到 XML 数据包中,那么使用实际的 XML API 会更好,它会为您编码这些数据。

      【讨论】:

        【解决方案4】:

        我想知道您是否最好将包含“魔术字符”的数据包装在 CDATA 部分中并称之为一天。让客户在收到它时将其剥离。

        【讨论】:

          【解决方案5】:
          protected static void escapeXMLSpecialCharactersAndWrite(Writer writer, String str) throws IOException {
          
              int len = str.length();
              for (int i = 0; i < len; i++) {
                  char c = str.charAt(i);
          
                  switch (c) {
                  case '&':
                      writer.write("&amp;");
                      break;
                  case '<':
                      writer.write("&lt;");
                      break;
                  case '>':
                      writer.write("&gt;");
                      break;
                  case '\"':
                      writer.write("&quot;");
                      break;
                  case '\'':
                      writer.write("&apos;");
                      break;
                  default:
                      writer.write(c);
                      break;
                  }
              }
          }
          

          【讨论】:

          • 你为什么要写这个而不是使用内置的 StringEscapeUtils.escapeXml ??
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多