去除 HTML 和在 PHP 中留下标点符号和外语的恶意代码

Strip out HTML and Malicious code leaving punctuation and foreign languages in 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 命令出错 - 未知变量 ID

我正在寻找的是最简单的脚本,用于删除所有 HTML 代码和奇怪的字符,用空格替换回车符 returns 并留下点逗号和感叹号等标点符号。

有很多类似的问题,但 none 似乎确实正确地回答了这个问题,并且这些脚本删除了所有字符,包括句子标点符号和外国阿拉伯语字体或西班牙语。

例如,如果字符串包含 www.mygreatwebsite.com

清洁脚本将 return wwwmygreatwebsitecom 看起来很奇怪。

如果有人对 'Hey this is a great website! ' 这样的事情感到兴奋,它也会删除感叹号。

我查找的所有类似问题都删除了所有字符....

我想使用一个简单的正则表达式命令将标点符号和任何外语字符保留下来,该命令清除人们粘贴到表单中的所有内容,但保留标点符号。

自然回车returns会被空格代替。

有什么建议吗?

要删除所有 html 代码,很简单,使用 strip_tags

$text = strip_tags($html);

但它仅在字符串不包含 css 或 javascript 代码时有效。

因此,处理此问题的更好方法是使用 DOMDocument 和 XPath 查找所有没有样式或脚本标记的文本节点作为祖先:

$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;
}

用 space:

替换标点符号以外的奇怪字符和 white-space 字符
$text = preg_replace('~[^\pP\pL\pN]+~u', ' ', $text);

其中\pP是一个字符class表示标点符号,\pL表示字母,\pN表示数字。 (要更准确地了解您要保留的字符,请查看可用字符 classes here (搜索 "Unicode character properties") )

很明显,你可以trim把正文写完:

$text = trim($text);

试试这个库来过滤东西 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);
}