В PHP я хочу кодировать амперсанды, которые еще не были закодированы. Я придумал это регулярное выражение
/&(?=[^a])/
Кажется, что он работает до сих пор, но, видя, что я не специалист по регулярному выражению, я спрашиваю, можно ли увидеть какие-либо потенциальные ловушки в этом регулярном выражении?
По существу он должен конвертировать &
в &
но оставить &
in &
как есть (чтобы не получить &
)
благодаря
Спасибо за ответы. Кажется, я не думал достаточно широко, чтобы охватить все базы. Это похоже на общую ловушку самих регулярных выражений (нужно думать обо всех возможностях, которые могут заставить ваше регулярное выражение получить ложные срабатывания). Конечно, он избил мою оригинальную str_replace(' & ', ' & ', $string);
🙂
Еще лучше было бы отрицательное утверждение, чтобы проверить & не следует за усилителем;
/&(?!amp;)/
Хотя это изменит любые амперсанды, используемые для других объектов. Если вы, вероятно, будете иметь других, то как насчет чего-то вроде
/&(?!#?[a-zA-Z0-9]+;)/
Это будет искать амперсанд, но утверждая, что за ним НЕ следует дополнительный хэш-символ (для числовых объектов), серия буквенно-цифровых символов и точка с запятой, которая должна охватывать именованные и числовые объекты, такие как "e;
или ª
$text="It’s 30 ° outside & very hot. T-shirt & shorts needed!"; $text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $text); echo "$text\n";
Что будет выводить
It’s 30 ° outside & very hot. T-shirt & shorts needed!
который более легко читается как «Это 30 ° снаружи и очень жарко. Футболка и шорты нужны!»
Как указывает Ionut G. Stan, из PHP 5.2.3 вы можете использовать htmlspecialchars с четвертым параметром false для предотвращения двойного кодирования, например
$text=htmlspecialchars($text,ENT_COMPAT,"UTF-8",false);
Он применит его для любого другого закодированного символа.
Если ваша версия PHP> = 5.2.3, вы можете использовать четвертый параметр функции htmlspecialchars . Если установлено значение false, он не будет преобразовывать существующие объекты.
В Perl это будет:
$content =~ s/&(?!\w+;)/&/g;
Он использует отрицательный результат 1 или более символов слова, что означает «амперсанд, за которым не следует один или несколько символов слов, и сразу же следует за точкой с запятой. Хотя использование os shortcut \ w не так безопасно, как определенный диапазон символов для этот конкретный случай. Лучшим вариантом будет:
$content =~ s/&(?![az]+;)/&/g;
И только в случае, если у вас есть данные о заглавном животном в ваших данных:
$content =~ s/&(?![a-zA-Z]+;)/&/g;
Что происходит, когда в документе есть другие объекты? Что происходит, если вы говорите о q & сеансе?
Я бы изолировал амперсанд, а не угадывал контекст, а затем использовал обратные ссылки в вашей заменяющей строке
/(\W)&(\W)/$1&$2/
Это потерпит неудачу в случае, когда символ «а» следует амперсанду, но не «ампер»; как & и & также & яблоко …
& (?! усилителя;)