SGS: Zeilenumbrüche aus bestimmten Bereich entfernen

Abend

Mein kleines Problem ist folgendes. Ich lasse alle Zeilenumbrüche, die ich in einem Textfeld mache, durch "nl2br" umwandeln in ein <br>.

Nun greift nl2br aber auch bei JavaScripten:

und macht diese damit unbrauchbar.

Bsp.:
Aus
<script language="JavaScript" type="text/javascript">
<!--
  document.write("Ich bin ein JavaScript");
//-->
</script>

wird:
<script language="JavaScript" type="text/javascript">
<!--<br />
  document.write("Ich bin ein JavaScript");<br />
//--><br />
</script>

Gibt es eine Möglichkeit, den Kontext zu durchsuchen nach <script [...] </script> und alle <br>'s in diesem Bereich zu (wieder) entfernen ohne dabei die gewünschten Umbrüche ebenfalls zu entfernen?

Mein (gescheiterter) Ansatz ist/war zunächst:
<?php
function nobr($content){

$searchstring = array(
    "<script[^>]*?>([<br />].+?)</script>"  //Auszug
  );

$replacestring = array(
    "\1"
  );

for ($i=0; $i<count($searchstring); $i++){

$search = $searchstring[$i];
    $replace = $replacestring[$i];

/* $content = str_replace("<br />","\n",preg_replace("'$search'si", $replace, $content)); */

$content = preg_replace("'$search'si", $replace, $content);

}

return $content;
}

$text = 'Text mit <br /> JavaScript TEXT TEXT <script language="JavaScript" type="text/javascript"> document.write("<b>Hallo</b><br />"); </script> und TEXT TEXT TEXT';
  echo nobr($text);

?>

So bekomme ich zwar den Text zwischen den Script Tags, jedoch enthalten diese ja bereits mein Problem Befehl.

Einer von Euch eine Idee, wie ich das Lösen könnte?

Micha

  1. Guten Morgen,

    Gibt es eine Möglichkeit, den Kontext zu durchsuchen nach <script [...] </script> und alle <br>'s in diesem Bereich zu (wieder) entfernen ohne dabei die gewünschten Umbrüche ebenfalls zu entfernen?

    es macht wenig Sinn erst zu ersetzen um dann wieder zu Löschen. Hinzu kommt, daß potenziell auch <ScRiPt ~> eingegeben werden könnte und es ebenso erlaubt ist
    <script
          id="kein_ahnung"
        type="text/javascript"
    language="JavaScript"

    zu notieren.

    Bei XHTML käme noch erschwerend hinzu, das es bei einer Referenz auf eine separate Datei nicht einmal einen End<Tag> geben muß...
    Für HTML könnte Deine Lösung so aussehen:

    $a=$_POST['textarea'];
    $b=str_replace('<script','æææææææ',strtolower($a));
    $b=str_replace('script>','æææææææ',$b);
    $b=explode('æææææææ',$b);
    $c='';
    $x=0;
    $y=0;
    for($i=2;;$i++)
       {
       if($i % 2)
          {
          $c.=substr(trim($a),$y,strlen($b[$x])+7);
          $y+=strlen($b[$x])+7;
          $x++;
          }
       else
          {
          $c.=nl2br(substr(trim($a),$y,strlen($b[$x])+7));
          $y+=strlen($b[$x])+7;
          $x++;
          }
       if(!isset($b[$x]))
          break;
       }
    echo $c;

    Gruß aus Berlin!
    eddi

    1. In Berichtigung:

      if($i % 2)
            {
            $c.=substr(trim($a),$y,strlen($b[$x])+7);

      # hier

      else
            {
            $c.=nl2br(substr(trim($a),$y,strlen($b[$x])+7));

      # und hier dringend trim() entfernen!
              # also substr($a,$y,strlen($b[$x])+7));

      Gruß aus Berlin!
      eddi

      1. Hallo Eddi

        Warum macht das wenig Sinn? Ein Leerzeichen wird ja nicht durch ein br ersätzt, somit wird es nie zu Deinem ersten geschilderten Fall kommen. Es wäre so, wie mein erstes Bsp.
        2. Script kann man sicher auf verschiedene Art und weisen schreiben. Deshalb habe ich ja auch preg_replace genommen, um GROSS/Kleinschreibung zu missachten. Selbst wenn es damit nicht gehen sollte (die <br>'s zu entfernen), kann ich Dir versichern, das ich stets die Seinga klein mache und auch der einzige bin, der dort was eintragen kann.

        Werd mir Deinen Lsgvorschlag mal ansehen - Danke
        Micha

        1. Hallo Eddi

          Nach Deiner Lösung habe ich nun folgendes umgesetzt, was auch zu funktionieren zuschein! Besten Dank nochmal dafür:

          $newcontent = $_POST['newcontent'];
          $newcontent=str_replace("<scr","#||#<scr",stripslashes($newcontent));
          $newcontent=str_replace("ipt>","ipt>#||#",stripslashes($newcontent));

          $searchscripttags = explode("#||#",$newcontent);

          $correctedcontent ="";

          for ($i=0; $i<count($searchscripttags); $i++){
            if (($i+1)%2 == 0){
             $correctedcontent.=$searchscripttags[$i];
            }
            else{
             $correctedcontent.=nl2br($searchscripttags[$i]);
            }
          }
          $newcontent = $correctedcontent;

          Micha

        2. Re:

          Warum macht das wenig Sinn?

          Es macht genausoviel Sinn, als würdest Du zwei Eimer voll Wasser füllen und den einen wieder auskippen.

          Gruß aus Berlin!
          eddi

          1. Naja, das würde ja vorraussetzten, dass die Seite zu 50% aus einem JS besteht... Das ist aber nicht der Fall. Grundsätzlich gehe ich immer erst den Weg, alles nicht zu zulassen um dann anschließend das wieder zu zulassen, was ich möchte.

            Nichtsdestotrotz hast Du mir mit Deiner Lösung den Ansatz verraten, den ich gesucht habe/hatte - dafür nochmals Danke!

            Micha