zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden Brauche Hilfe bei preg_match | CSS im Newssystem

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 18.01.2007, 13:31
Benutzerbild von Zen5656
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 24.07.2006
Beiträge: 378
Zen5656 befindet sich auf einem aufstrebenden Ast
Standard Brauche Hilfe bei preg_match | CSS im Newssystem

Moin

Ich habe vor einiger Zeit ein Newssystem gebastelt. Es wird Titel, Datum HTML und CSS eines Menüeintrages in eine DB abgespeichert und von dort eben wieder ausgelesen.

Html würde dann bei der Ausgabe ungefähr so aussehen:

Code:
<h3>Merry Christmas and Happy New Year</h3>
<div id="eintrag_29">
     <p class="lilatext">Ich bin ein lustiger Text</p>
     <img src="bla.jpg" alt="" />
     <a href="#">Ich bin ein Hyperlink</a>
<div>
Man beacht, dass nur der Inhalt vom div in der DB gespeichert war! Das mit der ID wurde automatisch generiert damit man dem Eintrag sein CSS zuweisen kann.


So und jetzt das CSS

Code:
.lilatext {
     color: #861D86;
}

img {
     display: block;
     margin: 0 auto;}

a { text-decoration: none

}
Ich habe die spitze Klammer in der Mitte absichtlich so geschrieben. Wenn ich jetzt auf einer Seite mehrere Newseinträge auslese muss ich verständlicherweise jedem <div id="eintrag_n"> sein CSS geben.

In der DB ist das aber nicht so abgespeichert. Darum muss ich den CSS String ändern. Und das ist jetzt schwer!

Vor jedem CSS Teil muss quasi #eintrag_n eingefügt werden. Beispielsweise #eintrag_29 a { text-decoration: none }

Aber wie finde ich diese Stellen. Stichwort preg_replace. Der einfachste hinweis ist ja die Spitze Klammer:


Regel: Finde { im string. Dann gehe soweit nach vorne bis du den [Zeilenumbruch] findest. Diesen ersetzt du dann mit [Zeilenumbruch].'#eintrag_n '


Ok Aber wie geht das? Kann mir da bitte jmd den Regex-Code schreiben oder zumindest hilfen geben? Ich bin sonst ziemlich verloren!

Vielen Dank

MfG Zen

Edit:

Ich weiß das Regex nicht wirklich ein angenehmes Thema ist.

Also man muss eigentlich folgedendes Ding suchen:

[Zeilenanfang][irgend ein string][{]

Und dann mit [Zeilenanfang]$neu[irgend ein string][{] ersetzen.

Kann mir da bitte mal jmd helfen?

Danke

MfG Zen
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 18.01.2007, 13:53
Alles- & Nixkönne
XHTMLforum-Mitglied
 
Registriert seit: 05.10.2006
Ort: Hamburg
Beiträge: 156
Ernie wird schon bald berühmt werden
Standard

Moin,

warum weist du den Eintrag divs nicht direkt eine Klasse zu, oder soll jede id andere Styles haben?
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 18.01.2007, 13:54
Benutzerbild von Zen5656
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 24.07.2006
Beiträge: 378
Zen5656 befindet sich auf einem aufstrebenden Ast
Standard

Jede ID andere Styles. Und zwar das CSS das auch in der DB bei dem Eintrag abgespeichert ist.
Mit Zitat antworten
  #4 (permalink)  
Alt 18.01.2007, 14:39
Benutzerbild von The Doc
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 19.01.2005
Beiträge: 1.113
The Doc befindet sich auf einem aufstrebenden Ast
Standard

Gesetz dem Fall, du lässt wirklich nur so "leichte" Selektoren zu, und nicht etwa etwas wie
Code:
a,
b, c d e {
 ...
}
Dann geht das doch ganz einfach:
PHP-Code:
<?php
$str 
'.lilatext {
    color: #861D86;
}
img {
    display: block;
    margin: 0 auto;
}
a {
    text-decoration: none
}'
;
$id '#eintrag_29';

# remove empty lines
$str preg_replace('#\n(\s*\n)+#',"\n",$str);
# add id
$str preg_replace('#^[^\{\}]+\{$#m',$id.' $0',$str);

echo 
$str;
?>
Das lässt sich sicher auch noch recht einfach ausbauen, dass man kompliziertere Selectoren unterstützt.
__________________
Bitte keine PN's - schreibt mir ne anständige Mail oder sprecht mich über Msn / Icq an
Milian Wolff | Markdownify | Typogridder
Mit Zitat antworten
  #5 (permalink)  
Alt 18.01.2007, 14:39
Benutzerbild von inta
free as in freedom
XHTMLforum-Kenner
 
Registriert seit: 04.12.2006
Ort: Berlin
Beiträge: 5.024
inta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz sein
Standard

Hm, gute Gelegenheit um mal zu schauen was man noch so in Sachen regexp drauf hat

PHP-Code:
preg_replace('/\n?.+\{{1}/m''#bla $0'$style); 
Das sollte das tun, was du haben willst. "#bla" muss natürlich durch die entsprechende Klasse mit der ID ersetzt werden.

Zur Erklärung:
\n = newline, das würde also mit Unix- und Windowszeilenumbrüchen hinhauen
? = 0 oder 1 mal das vorangegangene Zeichen (in diesem Fall newline)
. = beliebiges Zeichen außer newline
+ = das 1 mal oder öfter vorkommt
\{ = die hübsche Klammer (escaped, da es ein besonderes Zeichen ist)
{1} = kommt genau 1 mal vor

$0 = referenziert auf die Übereinstimmung mit dem Suchmuster

Mehr gibts hier zu lesen:
PHP: Pattern Syntax - Manual

Edit:
Da war wohl jemand schneller... und ich hab Kommaseparierte Zuweisungen außen vor gelassen.

Geändert von inta (18.01.2007 um 14:43 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 18.01.2007, 14:41
Neuer Benutzer
neuer user
 
Registriert seit: 01.02.2005
Beiträge: 5
Thaliada befindet sich auf einem aufstrebenden Ast
Standard

Code:
$arr_css = file($deineCssDatei); // Css Datei Zeilenweise in Array einlesen

for ($i = 0; $i < count($arr_css); $i++) {
echo preg_replace('%(.*?)\{(.*?)%', "#eintrag_".$eintragNr." \\1 { \\2\n", $arr_css[$i]); // Wenn { vorhanden entsprechend ersetzen.
}
Geht sicher auch eleganter und einfacher, sollte so aber imo funktionieren.
Mit Zitat antworten
  #7 (permalink)  
Alt 18.01.2007, 14:56
Benutzerbild von Zen5656
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 24.07.2006
Beiträge: 378
Zen5656 befindet sich auf einem aufstrebenden Ast
Standard

Haha ihr seit ja lustig. Ich Drück schon die ganze Zeit hier F5 und dann in drei Minuten drei Posts

@TheDoc
Ok das ist natürlich auch eine möglichkeit. Allerdings verliert dann mein Code an übersichtlichkeit/Strukturierung. Und was ist, wenn garkeine leere Zeile vorhanden ist? => Script funktioniert nicht.

@Thaliada
Kann ich das dann wieder zu einem einfach string zurückwandeln das mit echo ausgegeben werden kann?

@inta

Joa das sieht gut aus ) Leider wird das #bla dann vor dem Zeilenumbruch geschrieben. Brauche es aber dahinter.

Sieht so aus:

Code:
FOOBAR .lilatext {
    color: #861D86;
}
FOOBAR 
img {
    display: block;
    margin: 0 auto;
}
FOOBAR 
a {
    text-decoration: none
}
Also wie Trenne ich [Zeilenanfang] und [irgend ein string {]?

Danke für eure Hilfe

MfG Zen
Mit Zitat antworten
  #8 (permalink)  
Alt 18.01.2007, 15:11
Benutzerbild von inta
free as in freedom
XHTMLforum-Kenner
 
Registriert seit: 04.12.2006
Ort: Berlin
Beiträge: 5.024
inta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz sein
Standard

So, jetzt passt das mit dem Zeilenumbruch und es rafft auch Kommata, nur leider noch nicht wenn sie in einer Zeile stehen.
PHP-Code:
preg_replace('/(^|\n){1}(.+(\{|,){1})/m''#bla $2'$style); 
Mit Zitat antworten
  #9 (permalink)  
Alt 18.01.2007, 15:15
Benutzerbild von Zen5656
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 24.07.2006
Beiträge: 378
Zen5656 befindet sich auf einem aufstrebenden Ast
Standard

Wow du hast es echt drauf *neidisch*

Ok und wie krieg ich jetzt die Zeilenumbrüche wieder vor #bla

Und warum wären Komma ein Problem gewesen? *. macht doch angeblich alles außer Zeilenumbruch?

MfG Zen

Edit: was macht /m am Schluß?
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 18.01.2007, 15:40
Benutzerbild von inta
free as in freedom
XHTMLforum-Kenner
 
Registriert seit: 04.12.2006
Ort: Berlin
Beiträge: 5.024
inta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz sein
Standard

Das "m" steht für multiline, der eigentlich reguläre Ausdruck steht zwischen den Slashes (/).

Also bei mir sind die Zeilenumbrüche noch vorhanden... Poste sonst nochmal den aktuellen Code, ich kanns nicht nachvollziehen.

Woran es mit dem Komma hakt weiß ich grad auch nicht. Da steh ich aufm Schlauch.
So gut bin ich darin nu auch wieder nicht
Die anderen haben auch funktionierende Lösungen abgeliefert. (Die es eventuell sogar besser tun? Ich habe es nicht ausprobiert.)
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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 aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Hilfe bei CSS Desing Umsetzung. Frosti1986 CSS 7 27.02.2010 13:08
Brauche Hilfe... steeeefiii CSS 13 04.09.2009 22:41
absoluter css neuling braucht hilfe wegen bullets ben2308 CSS 10 02.08.2009 12:45
Hilfe bei gesamten CSS Layout mexxat CSS 0 22.08.2007 13:40
CSS Newbee braucht Hilfe :( Duodeviginti CSS 6 17.11.2004 09:54


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:16 Uhr.