php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 27.12.2005, 13:31  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 392
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard Compilation failed: lookbehind assertion is not fixed length

Hallo,

ich möchte folgendes mit einem regulären Ausdruck erreichen:
Es gibt einen Text, der enthält Normale Zeilenumbrüche.
In diesem Text sind Listen eingebettet (mit <ul>[/list]).
Diese Listen werden wegen der Übersichtlichkeit auch jeweils nach den htmltags umgebrochen.
Nun möchte ich alle Umbrüche, die zwischen Tags stehen, entfernen.
Alle anderen sollen bestehen bleiben.

Ansatz:
Lookahead und Lookbehind assertions. Das Muster soll nur erkannt werden, wenn vorher ein Tag steht und nachher ein schließender Tag vom gleichen Typ.

PHP-Code:
<?php
$string     
"Das hier ist die Überschrift\n\n<ul>\n[*]1\n[*]2\n[/list]Das hier ist die 2. Überschrift\n\ndas hier ist ein text.";
$regex         "!^(?<=<.*\>)[\\r|\\n]+(?=\</$1\>)!isU";
$replace    "";

echo 
nl2br(preg_replace($regex,$replace,$string));
?>
Dabei tritt der genannte Fehler auf:
Compilation failed: lookbehind assertion is not fixed length.

Weiß jemand Rat?
Andreas ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.12.2005, 13:35  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Zumindest hast du schonmal das 2. < nicht escaped.
Bin mir nicht sicher, aber kann man Assertions überhaupt gruppieren (und damit per $1 wiederverwenden)? Es ist doch lediglich eine Ja-Nein-Bedingung, oder?
Zergling-new ist offline   Mit Zitat antworten
Alt 27.12.2005, 13:43  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 392
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Falscher ausdruck. Sorry, hier der richtige
:
PHP-Code:
<?php
$string     
"Das hier ist die Überschrift\n\n<ul>\n[*]1\n[*]2\n[/list]Das hier ist die 2. Überschrift\n\ndas hier ist ein text.";
$regex "!^(?<=\<(.*)\>)[\\r|\\n]+(?=\</\$1\>)!isU";
$replace "";
echo 
nl2br(preg_replace($regex,$replace,$string));
?>
Das will ich ja grade wissen. Ob mein Ansatz überhaupt funktioniert. Vielleicht gehts ja auch viel einfacher. Ich arbeite noch nicht lange mit assertions. Klar dem Fehler nach zu Urteilen, ist der * in der Lookahead-assertion der übeltäter, aber ich weiß nicht, wie ich einen beliebig langen Tag sonst festlegen soll.
Andreas ist offline   Mit Zitat antworten
Alt 27.12.2005, 13:58  
Gast
 
Beiträge: n/a
Standard

Erstmal rum Testen (Nur für dieses Beispiel):

PHP-Code:
<?php
'#((?<=\<ul\>)(\\r|\\n)+|(\\r|\\n)+(?=\</ul\>))#isU'
// oder
'#((?<=\<(ul|li)\>)(\\r|\\n)+|(\\r|\\n)+(?=\</(ul|li)\>))#isU'
?>
Normalerweise gibt es kein \\n
  Mit Zitat antworten
Alt 27.12.2005, 16:38  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 392
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Mhh. Damit kommt bei mir folgendes raus:
Code:
Das hier ist die Überschrift



<ul>[*]1(!!!!!!)
(!!!!!!)[*]2[/list]Das hier ist die 2. Überschrift



das hier ist ein text.
Demnach vergisst er einen Umbruch. UND: Er soll das ja nicht nur für einen Tag oder für 2 Tags machen, sondern für alle.
*kopfkratz*
Andreas ist offline   Mit Zitat antworten
Alt 27.12.2005, 16:48  
Gast
 
Beiträge: n/a
Standard

Zitat:
sondern für alle.
Hmmmm, dann brauchst du nur alle \r oder \n entfernen.
Wozu jetzt dieser Aufwand ?
str_replace() anwenden und fertig
  Mit Zitat antworten
Alt 27.12.2005, 17:20  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Das zeigt mal wieder, warum man Daten unformatiert in einem Daten(bank)-System ablegen sollte..
Zergling-new ist offline   Mit Zitat antworten
Alt 27.12.2005, 17:23  
Gast
 
Beiträge: n/a
Standard

Naja, wenn alle \r und \n zwischen Tags entfernt werden sollen, also AUCH BODY oder HTML, dann ist diese ganze Sache mit regulären Ausdrücken völlig sinnlos.
Dann kann er gleich alle \r oder \n rauskicken

EDIT:

Den Rest kann man dann mit CSS bearbeiten ...
  Mit Zitat antworten
Alt 28.12.2005, 08:18  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 392
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ok, dann muss ich mal zu einer kurzen Erklärung ausholen, bevor ich gelüncht werde:

Vorhanden ist eine alte Datenbank, die Texte enthält, welche vollgepflastert mit HTML-Tags sind. Das sind seeehr viele Texte.
Diese Seite soll aber möglichst bald wieder online gehen.
Das bedeutet, der Pflegeaufwand für die Texte wäre sehr hoch.
Nachher soll der Text mit einem nl2br(); angezeigt werden.

Bei einer Liste (<ul>) ist das aber tödlich, weil diese
Formatierungen die Liste etwas bescheuert aussehen lassen.

Um das ganze zu umgehen, dachte ich an ein preg replace.
In der Datenbank steht nur HTML-Code zur Textformatierung, nicht mit <html> oder <body>-Tags.
Andreas ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[gelöst] Compilation failed: missing ) at offset 25 ? Chr!s PHP Tipps 2005-2 1 13.07.2005 17:56

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
assertions failed, compilation failed: lookbehind assertion is not fixed length, lookbehind assertion is not fixed length, lookbehind assertion is not fixed length at offset, lookbehind fixed length, php \compilation failed: lookbehind assertion is not fixed length\, look behind php fixed length, php compilation failed: lookbehind assertion is not fixed length at offset, php regex fixed length, \lookbehind assertion is not fixed length\ regex \\\r\, lookbehind assertion is not fixed, \lookbehind assertion is not fixed length\, php regular expression lookahead compilation failed, was heisst\look for fail, lookbehind assertion is not fixed length at, php lookbehind assertion is not fixed length, lookbehind assertion is not fixed length php, assert(is length) php, compilation failed: lookbehind assertion

Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.