Я использую HTML Purifier (http://htmlpurifier.org/)
Я просто хочу удалить теги <script>.
Я не хочу удалять встроенное форматирование или любые другие вещи.
Как я могу это достичь?
Еще одна вещь: есть ли другой способ удалить теги script из HTML
Я использую HTML Purifier (http://htmlpurifier.org/)
Я просто хочу удалить теги <script>.
Я не хочу удалять встроенное форматирование или любые другие вещи.
Как я могу это достичь?
Еще одна вещь: есть ли другой способ удалить теги script из HTML
Поскольку этот вопрос отмечен regex В этой ситуации я собираюсь ответить с решением бедного человека:
$html = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $html);
Однако регулярные выражения не предназначены для синтаксического разбора HTML/XML, даже если вы пишете идеальное выражение, оно в конечном итоге сломается, это не стоит, хотя в некоторых случаях полезно быстро исправить некоторую разметку, и, как и в случае с быстрые исправления, забудьте о безопасности. Используйте регулярное выражение только по содержимому/разметке, которому вы доверяете.
Помните, что все входы пользователя должны считаться небезопасными.
Лучшее решение здесь должно было бы использовать DOMDocument, который предназначен для этого.
Вот фрагмент, который демонстрирует, как легко, чисто (по сравнению с регулярным выражением), (почти) надежным и (почти) безопасным, сделать то же самое:
<?php
$html = <<<HTML
...
HTML;
$dom = new DOMDocument();
$dom->loadHTML($html);
$script = $dom->getElementsByTagName('script');
$remove = [];
foreach($script as $item)
{
$remove[] = $item;
}
foreach ($remove as $item)
{
$item->parentNode->removeChild($item);
}
$html = $dom->saveHTML();
Я умышленно удалил HTML, потому что даже это может bork.
Используйте парсер PHP DOMDocument.
$doc = new DOMDocument();
// load the HTML string we want to strip
$doc->loadHTML($html);
// get all the script tags
$script_tags = $doc->getElementsByTagName('script');
$length = $script_tags->length;
// for each tag, remove it from the DOM
for ($i = 0; $i < $length; $i++) {
$script_tags->item($i)->parentNode->removeChild($script_tags->item($i));
}
// get the HTML string back
$no_script_html_string = $doc->saveHTML();
Это помогло мне использовать следующий HTML-документ:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>
hey
</title>
<script>
alert("hello");
</script>
</head>
<body>
hey
</body>
</html>
Просто имейте в виду, что парсер DOMDocument требует PHP 5 или больше.
Я бы использовал BeautifulSoup, если он доступен. Делает это очень просто.
Не пытайтесь делать это с помощью регулярных выражений. Таким образом, безумие.
Я боролся с этим вопросом. Я обнаружил, что вам действительно нужна только одна функция. explode (' > ', $html); Единым общим знаменателем для любого тега является < и > . Затем после этого это обычно кавычки ("). Вы можете легко извлечь информацию, как только найдете общий знаменатель. Вот что я придумал:
$html = file_get_contents('http://some_page.html');
$h = explode('>', $html);
foreach($h as $k => $v){
$v = trim($v);//clean it up a bit
if(preg_match('/^(<script[.*]*)/ius', $v)){//my regex here might be questionable
$counter = $k;//match opening tag and start counter for backtrace
}elseif(preg_match('/([.*]*<\/script$)/ius', $v)){//but it gets the job done
$script_length = $k - $counter;
$counter = 0;
for($i = $script_length; $i >= 0; $i--){
$h[$k-$i] = '';//backtrace and clear everything in between
}
}
}
for($i = 0; $i <= count($h); $i++){
if($h[$i] != ''){
$ht[$i] = $h[$i];//clean out the blanks so when we implode it works right.
}
}
$html = implode('>', $ht);//all scripts stripped.
echo $html;
Я вижу, что это действительно работает только для тегов script, потому что у вас никогда не будет вложенных тегов script. Конечно, вы можете легко добавить еще код, который выполняет ту же проверку и собирает вложенные теги.
Я называю это аккордеонным кодированием. лопаются(); взорваться(); это самые простые способы, чтобы ваша логика протекала, если у вас есть общий знаменатель.
$html = <<<HTML
...
HTML;
$dom = new DOMDocument();
$dom->loadHTML($html);
$tags_to_remove = array('script','style','iframe','link');
foreach($tags_to_remove as $tag){
$element = $dom->getElementsByTagName($tag);
foreach($element as $item){
$item->parentNode->removeChild($item);
}
}
$html = $dom->saveHTML();
Короче:
$html = preg_replace("/<script.*?\/script>/s", "", $html);
При выполнении регулярных выражений все может пойти не так, поэтому сделать это безопаснее:
$html = preg_replace("/<script.*?\/script>/s", "", $html) ? : $html;
Итак, когда происходит "авария", мы получаем исходный $html вместо пустой строки.
проблема с стрелками script заключается в том, что они могут иметь более одного варианта
ех. (< =
<=&lt;) и ( >=>=&gt;)
поэтому вместо создания массива шаблонов, как вариант bazillion, imho лучшим решением будет
return preg_replace('/script.*?\/script/ius', '', $text)
? preg_replace('/script.*?\/script/ius', '', $text)
: $text;
это приведет к удалению всего, что выглядит как script.../script, независимо от кода/варианта стрелки, и вы можете проверить его здесь https://regex101.com/r/lK6vS8/1
Пример модификации ответа ctf0. Это нужно сделать только для preg_replace один раз, а также проверить наличие ошибок и заблокировать код char для косой черты.
$str = '<script> var a - 1; </script>';
$pattern = '/(script.*?(?:\/|/|/)script)/ius';
$replace = preg_replace($pattern, '', $str);
return ($replace !== null)? $replace : $str;
Если вы используете php 7, вы можете использовать оператор null coalesce, чтобы упростить его еще больше.
$pattern = '/(script.*?(?:\/|/|/)script)/ius';
return (preg_replace($pattern, '', $str) ?? $str);
Это упрощенный вариант ответа Деяна Марьяновича:
function removeTags($html, $tag) {
$dom = new DOMDocument();
$dom->loadHTML($html);
foreach (iterator_to_array($dom->getElementsByTagName($tag)) as $item) {
$item->parentNode->removeChild($item);
}
return $dom->saveHTML();
}
Может использоваться для удаления любого тега, включая <script>:
$scriptlessHtml = removeTags($html, 'script');
используйте функцию str_replace, чтобы заменить их пустым пространством или чем-то
$query = '<script>console.log("I should be banned")</script>';
$badChar = array('<script>','</script>');
$query = str_replace($badChar, '', $query);
echo $query;
//this echoes console.log("I should be banned")
?>