Zeilenumbrüche aus bestimmten Bereich entfernen
SGS
- php
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
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
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
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
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
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
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