Извините за разжигание старой нити: Я столкнулся с той же проблемой, и обходной путь, который я использовал, состоял из 3 шагов:
- Определение допустимых ссылок на сущности и ' скрытие ' их от регулярного выражения
- замена неэкранированные символы с помощью регулярных выражений
- Восстановление ранее ' скрытых ' ссылок на сущности
Скрытие осуществляется путем включения сущностей в пользовательские последовательности символов.например, "#||<ENTITY_NAME>||#
"
Для иллюстрации, скажем, у нас есть этот фрагмент XML с неэкранированным символом &
:
<NAME>Testname</NAME>
<VALUE>
random words one & two
I am sad&happy; at the same time!
its still < ecstatic
It is two & three words
Short form is 2&three
Now for some invalid entity refs: &, >, and < too.
</VALUE>
Step1: Мы используем регулярное выражение заменить "[&]\(amp|apos|gt|lt|quot\)[;]"
на "#||$1||#"
.Это связано с тем, что действительными ссылками на сущность XML согласно W3C являются amp, lt, gt, apos & quot .Строка теперь выглядит следующим образом:
<NAME>Testname</NAME>
<VALUE>
random words one #||amp||# two
I am sad&happy; at the same time!
its still #||lt||# ecstatic
It is two & three words
Short form is 2&three
Now for some invalid entity refs: &, >, and < too.
</VALUE>
Только действительные ссылки на сущности были скрыты .&happy;
остался нетронутым.
Step2: Замените ли регулярное выражение "[&]"
на "&"
.Строка теперь выглядит так:
<NAME>Testname</NAME>
<VALUE>
random words one #||amp||# two
I am sad&happy; at the same time!
its still #||lt||# ecstatic
It is two & three words
Short form is 2&three
Now for some invalid entity refs: &amp, &gt, and &lt too.
</VALUE>
Шаг 3: Замените ли регулярное выражение "#\|\|([a-z]+)\|\|#"
на "&$1;"
.Окончательная исправленная строка теперь выглядит следующим образом:
<NAME>Testname</NAME>
<VALUE>
random words one & two
I am sad&happy; at the same time!
its still < ecstatic
It is two & three words
Short form is 2&three
Now for some invalid entity refs: &amp, &gt, and &lt too.
</VALUE>
Недостатки: Необходимо тщательно выбирать пользовательскую последовательность символов для скрытия действительного объекта, чтобы убедиться, что никакое действительное содержимое не будет случайно содержать такую же последовательность.Хотя шансы минимальны, но признаются, что это не полностью защищенное решение ...