Удалите HTML и вредоносный код, оставив знаки препинания и иностранные языки в PHP

function stripAlpha( $item )
{
    $search     = array( 
         '@<script[^>]*?>.*?</script>@si'   // Strip out javascript 
        ,'@<style[^>]*?>.*?</style>@siU'    // Strip style tags properly 
        ,'@<[\/\!]*?[^<>]*?>@si'            // Strip out HTML tags
        ,'@<![\s\S]*?–[ \t\n\r]*>@'         // Strip multi-line comments including CDATA
        ,'/\s{2,}/'
        ,'/(\s){2,}/'
    );
    $pattern    = array(
         '#[^a-zA-Z ]#'                     // Non alpha characters
        ,'/\s+/'                            // More than one whitespace
    );
    $replace    = array(
         ''
        ,' '
    );
    $item = preg_replace( $search, '', html_entity_decode( $item ) );
    $item = trim( preg_replace( $pattern, $replace, strip_tags( $item ) ) );

    return $item;
}

Один человек предложил заменить весь этот скрипт одним вкладышем:

$clear = preg_replace('/[^A-Za-z0-9\-]/', '', urldecode($_GET['id']));

но это дает ошибку с командой $_GET - неизвестный идентификатор переменной

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

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

например, если строка содержит www.mygreatwebsite.com

более чистый скрипт вернет wwwmygreatwebsitecom, что выглядит странно.

Если кто-то взволнован чем-то вроде «Эй, это отличный веб-сайт! ' он также удаляет восклицательные знаки.

Все подобные вопросы, которые я искал, удаляют все символы....

Я хотел бы оставить IN знаки препинания и любые символы иностранного языка с помощью одной простой команды регулярного выражения, которая очищает все, что люди вставляют в формы, но оставляет знаки препинания.

Естественно, возврат каретки будет заменен пробелами.

Какие-либо предложения?


person Viktor    schedule 11.05.2015    source источник


Ответы (2)


Чтобы удалить весь html-код, это легко, используйте strip_tags

$text = strip_tags($html);

Но это работает, только если строка не содержит код css или javascript.

Таким образом, лучший способ справиться с этой проблемой — использовать DOMDocument и XPath для поиска всех текстовых узлов, которые не имеют стиля или тега script в качестве предка:

$dom = new DOMDocument;
$dom->loadHTML($html);

$xp = new DOMXPath($dom);

$textNodeList = $xp->query('//text()[not(ancestor::script) and not(ancestor::style)]');

$text = '';

foreach($textNodeList as $textNode) {
    $text .= ' '. $textNode->nodeValue;
}

чтобы заменить странные символы и символы пробела, кроме знаков препинания, пробелом:

$text = preg_replace('~[^\pP\pL\pN]+~u', ' ', $text);

Где \pP — это класс символов для знаков препинания, \pL для букв, \pN для цифр. (чтобы уточнить символы, которые вы хотите сохранить, взгляните на доступные классы символов здесь (ищите "Свойства символа Unicode"))

очевидно, вы можете обрезать текст, чтобы закончить:

$text = trim($text);
person Casimir et Hippolyte    schedule 11.05.2015
comment
Из документации strip_tags: Поскольку strip_tags() на самом деле не проверяет HTML, частичные или поврежденные теги могут привести к удаление большего количества текста/данных, чем ожидалось. Справедливое предупреждение в случае появления нежелательных результатов. - person Muhammad Abdul-Rahim; 11.05.2015
comment
@MariM: да, но нет реальных способов предотвратить это, даже с помощью DOMDocument или подхода с регулярными выражениями. - person Casimir et Hippolyte; 11.05.2015
comment
Получилось - красиво! Спасибо. Хотел бы я СТРЕЛКУ ВВЕРХ, но моя репутация не 15 - как я могу повысить свою репутацию? - person Viktor; 11.05.2015

попробуйте эту библиотеку для фильтрации вещей http://htmlpurifier.org/

function removeHTML($html) {
require_once('htmlpurifier/library/HTMLPurifier.auto.php');
$config = HTMLPurifier_Config::createDefault();
$config->set('Core', 'Encoding', 'ISO-8859-1'); // not using UTF-8
$config->set('HTML', 'Allowed', ''); // Allow Nothing
$purifier = new HTMLPurifier($config);
return $purifier->purify($html);
}
person Subin S V    schedule 11.05.2015