preg replace — убирает HTML и вредоносный код, оставляя знаки препинания и иностранные языки в переполнении стека

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 знаки препинания и любые символы иностранных языков с помощью одной простой команды регулярного выражения, которая удаляет все элементы, которые люди вставляют в формы, но оставляет знаки препинания.

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

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

0

Решение

Чтобы удалить весь 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;
}

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

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

куда \pP класс символов для знаков пунктуации, \pL для писем, \pN для цифр. (чтобы быть более точным в отношении символов, которые вы хотите сохранить, посмотрите на доступные классы символов Вот (поиск по «свойствам символов Юникода»))

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

$text = trim($text);
3

Другие решения

попробуйте эту библиотеку для фильтрации вещей
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);
}
1

По вопросам рекламы [email protected]