заменить набор символов другим набором символов (в паре): "&", "&" "<", "<" и т. д. в регулярном выражении - PullRequest
0 голосов
/ 03 марта 2009

Мне нужно правильно закодировать 5 зарезервированных символов XML (& <> "и ') следующим образом:

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

Я могу сделать их один за другим, но возможно ли в регулярном выражении что-то вроде ("[& | <|> | \" | \ '] "," & | <"); ... и т.д. не будет выполняться в 5 операциях одна за другой, но одновременно одновременно? </p>

кстати, возможно в Java используя String.replaceAll(regexpString, string);

Ответы [ 5 ]

5 голосов
/ 03 марта 2009

Используйте StringEscapeUtils.escapeXml в библиотеке commons-lang.

Кстати, я никогда не запускаю Java-процесс, не добавляя почти всю библиотеку commons к своим зависимостям. Они экономят много времени ..

<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.4</version>
</dependency>
1 голос
/ 03 марта 2009

См. Код на http://www.owasp.org/index.php/How_to_perform_HTML_entity_encoding_in_Java.

В Джакарте также есть широко используемый метод escapeXml , который будет охватывать его, хотя, если вы создаете HTML-совместимый XHTML, эти «объекты» нежелательны.

IMO регулярное выражение "одновременный" на самом деле не очень выгодно, если вы все равно выполняете только односимвольные замены.

0 голосов
/ 09 марта 2009
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;
        }
    }
}
0 голосов
/ 03 марта 2009

Если вы делаете это для того, чтобы вставить некоторые данные в пакет XML, вам было бы намного лучше использовать реальный XML API, который закодирует их для вас.

0 голосов
/ 03 марта 2009

Интересно, не лучше ли вам просто обернуть данные, содержащие "магические символы", в раздел CDATA и назвать это днем. Попросите клиента снять его, когда он его получит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...