[PHP] preg_replace() 'sidan kan inte visas'

Permalänk
Medlem

[PHP] preg_replace() 'sidan kan inte visas'

Kör preg_replace() på lite html-kod från en wysiwyg för att få in css i inline-style och kunna skicka iväg det som ett mail, men på längre strängar så får jag bara fram 'sidan kan inte visas'.

Så här ser koden ut:

$test = '<h2 style="font-size: 13px; margin-top: 20px; margin-right: 0px; margin-bottom: -10px; margin-left: 0px; padding-top: 8px; padding-right: 0px; padding-bottom: 0px; padding-left: 18px; background-image: url(http://www.test.se/test/test.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; background-position: 0px 1px; background-repeat: no-repeat no-repeat;">Test:<span class="Apple-style-span" style="font-size: 12px; font-weight: normal;"> </span></h2>'; $hej = 'margin: 20px 0 -10px 0; padding: 8px 0 0 18px; background: transparent url(http://www.test.se/test/test.gif) no-repeat; background-position: 0 1px; font-size: 12px; clear: both'; echo preg_replace('/(<h2)(?:((\s|[^>])*)style="((\s|[^"])*)")?((\s|[^>])*)((\s|\/|\s\/)*>)/', '\1\2 style="'.$hej.'\4"\6\8', $test);

Vad koden gör är alltså att den tar $hej och lägger till i style för h2 i $test, men när css:en som redan står i h2:s style är för lång så får jag helt enkelt bara upp 'sidan kan inte visas'. Att css:en är konstig behöver ni inte bry er om då det bara är ett test.

Scriptet kör egentligen genom alla element och lägger till css, men gjorde om det till lättast enkla kod som reproducerade felet.

Någon som kan komma på en lösning?

Permalänk
Medlem

Okej eftersom ingen verkar veta hur man kan lösa det, är det någon som vet något annat sätt att göra det på?

Det jag vill göra är helt enkelt att med ett php-script lägga till css-kod i ett visst element (t. ex. h2 eller body) i en automatiskt genererad html-kod.

Permalänk
Inaktiv

Varför vill du göra det?
Använd bara ett CSS dokument.

Permalänk
Medlem
Skrivet av anon150287:

Varför vill du göra det?
Använd bara ett CSS dokument.

Som sagt, det ska skickas ut som ett mail. Då många mailklienter inte stöder css på något annat sätt än inline-css så måste jag göra på detta sätt.

Lyckligtvis så har jag löst det nu genom att ändra regex till detta:

preg_replace('/(<h2)(?:([^>]*)style="([^"]*)")?([^>]*)((\s|\/|\s\/)*>)/', '\1\2 style="' . $hej . '\3"\4\5', $test);

Det jag tror förstörde för mig var att jag hade parenteser runt regex som tog fram massor av bokstäver med en stjärna efter, vilket ledde till att den lagrade varje bokstav som en variabel och fick slut på minne till sist.

Permalänk
Medlem
Skrivet av Apro:

Kör preg_replace() på lite html-kod

Gud nej. HTML är inget reguljärt språk och man kan därför inte använda reguljära uttryck för att läsa det.

Permalänk
Medlem

Väldigt konstruktivt inlägg, verkligen.

Då min kod uppfyller alla mina syften och har klarat av alla testscenarier jag har skickat till den så duger den gott för mig. Sen att den inte fungerar lika bra som en avancerad html-parser är en annan sak, men jag har ingen nytta av den extra funktionaliteten eller felsäkerheten.

Permalänk
Medlem
Skrivet av Apro:

Väldigt konstruktivt inlägg, verkligen.

Då min kod uppfyller alla mina syften och har klarat av alla testscenarier jag har skickat till den så duger den gott för mig. Sen att den inte fungerar lika bra som en avancerad html-parser är en annan sak, men jag har ingen nytta av den extra funktionaliteten eller felsäkerheten.

Alla testscenarior *du* skickat på den, ja. Ha det så roligt när någon oväntad HTML får ditt skript att dö. Reguljära uttryck har sin tid och sin plats, men det är inte för att läsa HTML, någonsin. Det slutar nästan alltid med att man skjuter sig själv i foten, eftersom man använder fel verktyg för uppgiften.

Permalänk
Medlem
Skrivet av You:

Alla testscenarior *du* skickat på den, ja. Ha det så roligt när någon oväntad HTML får ditt skript att dö. Reguljära uttryck har sin tid och sin plats, men det är inte för att läsa HTML, någonsin. Det slutar nästan alltid med att man skjuter sig själv i foten, eftersom man använder fel verktyg för uppgiften.

För det första: Det kommer ingen oväntad html eftersom jag har varit jävligt noggrann med vad som kommer in och hur den hanterar vad som kommer in.
För det andra: Det må vara fel verktyg, men eftersom jag med en rads kod kunde lösa uppgiften perfekt för mina syften så behöver jag inte rätt verktyg. (Varför ta 40 minuter för att åka till affären och köpa en slägga när man kan slå in kilen på 20 minuter med en hammare?)
För det tredje: Förväntar du dig verkligen att jag ska byta från en finslipad lösning till...... Nej just ja, du hade ju inte gett något förslag på en bättre lösning och förtjänar därför en medalj för dagens minst konstruktiva inlägg!

Permalänk
Medlem
Skrivet av Apro:

För det första: Det kommer ingen oväntad html eftersom jag har varit jävligt noggrann med vad som kommer in och hur den hanterar vad som kommer in.
För det andra: Det må vara fel verktyg, men eftersom jag med en rads kod kunde lösa uppgiften perfekt för mina syften så behöver jag inte rätt verktyg. (Varför ta 40 minuter för att åka till affären och köpa en slägga när man kan slå in kilen på 20 minuter med en hammare?)
För det tredje: Förväntar du dig verkligen att jag ska byta från en finslipad lösning till...... Nej just ja, du hade ju inte gett något förslag på en bättre lösning och förtjänar därför en medalj för dagens minst konstruktiva inlägg!

Använd ett verktyg som kan läsa SGML, ex. den här. Där har du din konstruktiva lösning du tydligen missade i länken i mitt första inlägg.

Permalänk
Skrivet av Apro:

För det första: Det kommer ingen oväntad html eftersom jag har varit jävligt noggrann med vad som kommer in och hur den hanterar vad som kommer in.
För det andra: Det må vara fel verktyg, men eftersom jag med en rads kod kunde lösa uppgiften perfekt för mina syften så behöver jag inte rätt verktyg. (Varför ta 40 minuter för att åka till affären och köpa en slägga när man kan slå in kilen på 20 minuter med en hammare?)
För det tredje: Förväntar du dig verkligen att jag ska byta från en finslipad lösning till...... Nej just ja, du hade ju inte gett något förslag på en bättre lösning och förtjänar därför en medalj för dagens minst konstruktiva inlägg!

För det första: Hur du än bestämmer dig för att göra kan det väl vara bra att veta att reguljära uttryck inte är att rekommendera för html?
För det andra: Varför ber du om hjälp på ett forum när du verkar veta allt bäst själv?
För det tredje: Det är väldigt oförskämt att vara otrevlig mot folk som försöker ge en hjälp.

Permalänk
Medlem
Skrivet av You:

Använd ett verktyg som kan läsa SGML, ex. den här. Där har du din konstruktiva lösning du tydligen missade i länken i mitt första inlägg.

Den tackar jag för och kommer säkerligen använda nästa gång jag behöver göra ingrepp i min html-kod. Vill bara påpeka att det var väldigt svårt att förstå att det var den du syftade på då du hade länkat till ett specifikt inlägg (som var markerat som lösning på tråden) som i stort sett bara påpekade hur dumt det var med regex för html, länken fanns först ett tiotal poster ner.

Skrivet av mel0dy:

För det första: Hur du än bestämmer dig för att göra kan det väl vara bra att veta att reguljära uttryck inte är att rekommendera för html?
För det andra: Varför ber du om hjälp på ett forum när du verkar veta allt bäst själv?
För det tredje: Det är väldigt oförskämt att vara otrevlig mot folk som försöker ge en hjälp.

Anledningen till att jag var otrevlig var att jag uppfattade det som att han bara ville spela smart och påpeka bristerna i min lösning (vilken faktisk fungerar till 100% för mig som sagt) utan att faktiskt hjälpa till på något sätt. Jag bad om hjälp för att jag behövde hjälp, men eftersom jag hade löst det innan någon svarade så blev jag tämligen irriterad av att bli dumförklarad.

You, hade du formulerat dig lite annorlunda och länkat lite mer specifikt så hade jag tagit emot kritiken med öppna armar, för det var ju trots allt därför jag postade här. Jag ber om ursäkt för att jag blev otrevlig.

Tack och adjö!