PHP Удалить JavaScript

Я пытаюсь удалить JavaScript из HTML.

Я не могу заставить регулярное выражение работать с PHP; это дает мне нулевой массив. Почему?

<?php
$var = '
<script type="text/javascript"> 
function selectCode(a) 
{ 
   var e = a.parentNode.parentNode.getElementsByTagName(PRE)[0]; 
   if (window.getSelection) 
   { 
      var s = window.getSelection(); 
       if (s.setBaseAndExtent) 
      { 
         s.setBaseAndExtent(e, 0, e, e.innerText.length - 1); 
      } 
      else 
      { 
         var r = document.createRange(); 
         r.selectNodeContents(e); 
         s.removeAllRanges(); 
         s.addRange(r); 
      } 
   } 
   else if (document.getSelection) 
   { 
      var s = document.getSelection(); 
      var r = document.createRange(); 
      r.selectNodeContents(e); 
      s.removeAllRanges(); 
      s.addRange(r); 
   } 
   else if (document.selection) 
   { 
      var r = document.body.createTextRange(); 
      r.moveToElementText(e); 
      r.select(); 
   } 
} 
</script>
';

   function remove_javascript($java){
   echo preg_replace('/<script\b[^>]*>(.*?)<\/script>/i', "", $java);

   }    
?>

Ответы

Ответ 1

это должно сделать это:

echo preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $var);

/s так, что точка. также соответствует символам новой строки.

Просто предупреждение, вы не должны использовать этот тип регулярного выражения для дезинфекции ввода пользователя для веб-сайта. Слишком много способов обойти это. Для дезинфекции используйте что-то вроде http://htmlpurifier.org/ library

Ответ 2

Это может сделать больше, чем вы хотите, но в зависимости от вашей ситуации вы можете посмотреть strip_tags.

Ответ 3

В вашем случае вы можете рассматривать строку как список строк с разделителями новой строки и удалять строки, содержащие теги script (сначала и от второго к последнему), и вам даже не нужны регулярные выражения.

Хотя если вы пытаетесь предотвратить XSS, этого может быть недостаточно, чтобы удалить теги script.

Ответ 4

Здесь идея

while (true) {
  if ($beginning = strpos($var,"<script")) {
    $stringLength = (strpos($var,"</script>") + strlen("</script>")) - $beginning;
    substr_replace($var, "", $beginning, $stringLength);
  } else {
    break
  }
}

Ответ 5

Я использую это:

function clear_text($s) {
    $do = true;
    while ($do) {
        $start = stripos($s,'<script');
        $stop = stripos($s,'</script>');
        if ((is_numeric($start))&&(is_numeric($stop))) {
            $s = substr($s,0,$start).substr($s,($stop+strlen('</script>')));
        } else {
            $do = false;
        }
    }
    return trim($s);
}

Ответ 6

function clean_jscode($script_str) {
    $script_str = htmlspecialchars_decode($script_str);
    $search_arr = array('<script', '</script>');
    $script_str = str_ireplace($search_arr, $search_arr, $script_str);
    $split_arr = explode('<script', $script_str);
    $remove_jscode_arr = array();
    foreach($split_arr as $key = > $val) {
        $newarr = explode('</script>', $split_arr[$key]);
        $remove_jscode_arr[] = ($key == 0) ? $newarr[0] : $newarr[1];
    }
    return implode('', $remove_jscode_arr);
}

Ответ 7

Это было очень полезно для меня. попробуйте этот код.

while(($pos = stripos($content,"<script"))!==false){
    $end_pos = stripos($content,"</script>");
    $start = substr($content, 0, $pos);
    $end = substr($content, $end_pos+strlen("</script>"));
    $content = $start.$end;
}
$text = strip_tags($content);