strip_tags php удаляет слишком много - PullRequest
0 голосов
/ 06 ноября 2018

Есть небольшие проблемы с искаженной строкой, включая html (см. '' В начале и <'blabla) и функцию strip_tags () из PHP. </p>

У меня есть этот код:

$str = "To: ''blablal@johndoe.com' <'blablal@johndoe.com>\nSubject: Hello World\nDear Ladies <b>and</b> Gentlemen,";
echo strip_tags($str);

Со следующим outout:

To: ''blablal@johndoe.com' 

Мой желаемый / ожидаемый результат:

To: ''blablal@johndoe.com' 
Subject: Hello World
Dear Ladies and Gentlemen,

У вас есть идеи, чтобы получить это?

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Поскольку strip_tags () фактически не проверяет HTML, частичные или поврежденные теги могут привести к удалению большего количества текста / данных, чем ожидалось.

См. руководство по PHP :

Ваш случай неверный HTML. HTML-валидатор говорит

Bad character ' after <. Probable cause: Unescaped <. Try escaping it as &lt;.
0 голосов
/ 06 ноября 2018

Причина в том, что когда стриппер находит <, следующий за непробельным символом, он предполагает, что он находится внутри тега. Затем внутри тега, если он видит кавычку, он устанавливает флаг (in_q), а затем ищет закрывающую пару. Если он находит закрывающую пару, он сбрасывает флаг in_q (in_q = 0;), но если он не находит его, он предполагает, что он все еще находится в кавычках, и потребляет все до конца и удаляет его из выход.

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

preg_replace('~<\S[^<>]*>~', '', $str); 

Смотрите демо здесь

0 голосов
/ 06 ноября 2018

Если conte_tags () не сработал, как вы ожидаете, попробуйте это.

$str = "To: ''blablal@johndoe.com' <'blablal@johndoe.com>\nSubject: Hello World\nDear Ladies <b>and</b> Gentlemen,";

$val = preg_replace('/<[^>]+?>/', ' ', $str);

Ваш $val содержит строку без html-значений

enter image description here

...