Regex для переформатирования строки в безопасный xml-тег - PullRequest
0 голосов
/ 30 ноября 2009

В настоящее время я пытаюсь написать RegexReplace, чтобы обеспечить возможность использования входных данных в качестве допустимого XML-тега, что означает: без пробелов, без специальных символов, только строчные буквы и т. Д. *

Есть ли общий подход к этому или я должен делать все это с нуля?

Пример:

string Invalid = "asd(%4 asKUd n!%mn &§a_As1";  // Invalid as a tag

string Valid = FormatToSafeXmlTag(Invalid);  // How to write this function?

// Valid = "asd4_askud_nmna_as1"

Ответы [ 3 ]

6 голосов
/ 30 ноября 2009

В соответствии с XML-спецификацией имя элемента формируется следующим образом:

Name   ::=  NameStartChar (NameChar)*

Где

NameStartChar  ::=  ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] 
  | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] 
  | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] 
  | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
NameChar       ::=  NameStartChar | "-" | "." | [0-9] | #xB7 
  | [#x0300-#x036F] | [#x203F-#x2040]

Что тривиально для преобразования в регулярное выражение.

Если вы хотите удалить любой символ вне этого определения, просто инвертируйте символы, которые ищет выражение.

2 голосов
/ 30 ноября 2009

XML-теги (я полагаю, вы спрашиваете об именах тегов) должны следовать следующим правилам:

  • начинаются с буквы, точки, двоеточия или подчеркивания
  • содержит только буквы, цифры, точку, подчеркивание или двоеточие (для пространств имен)
  • не должно начинаться с xml

Следовательно, регулярное выражение для допустимых имен тегов может быть:

^(?!xml)[\w.:][\w\d.:]*$

в зависимости от вашего вида регулярного выражения (например, .NET включает буквы Unicode в \w, что допустимо для имени тега). Вы также можете использовать

^(?!xml)[p\{L}._:][\p{L}\p{N}._:]*$

, если \w не содержит букв Unicode.

Но, конечно, вы можете использовать более строгие правила, и, возможно, не все анализаторы XML могут обрабатывать полные имена тегов Unicode. Итак, в итоге

^(?!xml)[A-Za-z._:][A-Za-z0-9._:]*$

может быть вашей лучшей ставкой ...

2 голосов
/ 30 ноября 2009
  • Только строчные буквы: ^[a-z]+$
  • Первый символ нижнего регистра, (необязательно) оставшийся символ нижнего регистра / цифры ^[a-z][a-z0-9]*$
  • Только заглавные буквы: ^[A-Z]+$
  • Первый буквенный символ, (необязательно) оставшиеся буквенно-цифровые символы ^[a-zA-Z][a-zA-Z0-9]*$

РЕДАКТИРОВАТЬ: Чтобы обрезать все, кроме строчных символов в JavaScript:

str = str.replace(/[^a-z]/g, "");

Подвох заключается в том, что пользователи вводят только недопустимые символы - в итоге вы попытаетесь создать тег xml с пустой строкой. Я бы лучше попросил пользователя повторить попытку - насколько сложно ввести строчную строку?

ВНИМАНИЕ: Еще один крайний случай - когда пользователь вводит xml или любые его варианты без учета регистра (благодаря ответу @ Tim). Если вы используете javascript, вы не можете использовать решение, предложенное Тимом, так как оно использует lookbehind, функцию, не поддерживаемую регулярным выражением javascript.

код JavaScript:

str = str.replace(/\s/g, "_"); //replaces spaces

str = str.replace(/[^a-zA-Z0-9_\-]/g, "");//trim symbols

var reg = new RegExp(/^xml/i); 

if(str.length == 0 || reg.test(str)) //is it empty or "xml" or "XmL" or ..
    alert("invalid regex");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...