[PHP] Parser met MySQL db

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Elvis
  • Registratie: Juli 2002
  • Laatst online: 18-11-2017

Elvis

Echo Lima Victor India Sierra

Topicstarter
(jarig!)
Goeiedag GoT,

Door gebruik te maken van de preg_replace(pattern, replacement, subject) * functie heb een eenvoudige UBB-parser gemaakt voor mijn website.
(*klik)

Eerst stonden pattern & replacement in verschillende array, maar op dezelfde plaats...
(subject is een string)

voorbeeld : (zonder gebruik te maken van de opmaak die nodig is voor preg_replace() )
PHP:
1
2
3
4
5
6
7
8
9
$subject = "[b]test[/b] & [i]test[/i]";

$pattern = array( [1] => "[b]woord[/b]", [2] => "[i]woord[/i]" );

$replacement = array( [1] => "<b>woord</b>", [2] => "<i>woord</i>" );

$text_out = preg_replace($pattern, $replacement, $subject);

echo $text_out;

Output : test & test
Dit werkt perfect.

Nu zou ik ipv elke UBB-code in mijn pagina te zetten(wat heel rommelig overkomt en zorgt voor verwarring), graag alle codes in een MySQL tabel hebben, met 2 kolommen, 1tje voor de UBBcode en 1tje waar de HTML in staat.

Ik lees alle waarden in met een while loop :
PHP:
1
2
3
4
5
6
7
$sql = "SELECT * FROM `ubb-code`";
$qresult = mysql_query($sql);
while($waarde = mysql_fetch_array($qresult))
{
$text_out = preg_replace($waarde[ubbcode], $waarde[vervang], $subject);
}
echo $text_out;
Nu komt het probleem :
De preg_replace() functie vervangt de ubbcode nog wel, maar door de letterlijke inhoud van de overeenkomstige cel in de 'vervang' kolom van de tabel.
Dus bij dezelfde tags als in het voorbeeld bovenaan is de output :
woord & woord

Heeft iemand hier een oplossing voor? Kan de functie niet werken met waarden die uit een tabel komen? Is er dan 1 die dat wel kan?

[ Voor 6% gewijzigd door Elvis op 14-04-2006 11:33 ]

[GoT] TF2 Clan


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
Sla [ b] en [ /b] apart op, dan ben je er van af :)

Het enige nadeel is dat de gebruiker makkelijker fouten kan maken.

[ Voor 43% gewijzigd door Gonadan op 14-04-2006 11:36 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

Je kan je replace denk ik een stuk beter dynamisch opbouwen, net zoals het pattern, aan de hand van de informatie in je tabel. Als je letterlijk <b>woord</b> opslaat, zal PRCE natuurlijk letterlijk daardoor replacen.

Je zou je een tabel met id, name, start_tag, end_tag, start_replacement en end_replacement kunnen voorstellen, waarbij je het pattern vervolgens opbouwt uit de start- en end-tag, en de replacement uit de start- en end-replacement :) .

DM!


Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Kun je een voorbeeld geven van een rij in je database?

Me dunkt dat het best moet werken wat je wil, maar dat je regexen verkeerd worden geescaped.

Rustacean


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

[b]woord[/b] is helemaal geen regexp en kan simpelweg niet werken? :? [b] is een character class met één letter, dus dat matcht alleen op "b". [/b] is een character class met alleen "/" of "b" erin. Uiteindelijk zou [b]woord[/b] als regexp alleen matchen op "bwoordb" of "bwoord/". Ware het niet dat er uit je voorbeeld ook nog eens de delimiters ontbreken. 8)7

Sla in je tabel "\\[b\](.*)\\[/b\]" op als pattern, en "<b>\\1</b>" als replacement. Maak dan van regel 5 in je code het volgende:
PHP:
5
$subject = preg_replace('#'.$waarde['ubbcode'].'#Ui', $waarde['vervang'], $subject);

Dat doet waarschijnlijk al meer. Let wel dat ik $text_out eruit gegooid heb omdat je anders continu alle replaces overschrijft. 8)7 En als je error_reporting op E_ALL had gehad staan, dan had je die andere "fout" op regel 5 ook gezien. ;)

[ Voor 5% gewijzigd door NMe op 14-04-2006 20:17 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Elvis
  • Registratie: Juli 2002
  • Laatst online: 18-11-2017

Elvis

Echo Lima Victor India Sierra

Topicstarter
(jarig!)
JHS schreef op vrijdag 14 april 2006 @ 11:44:
Je kan je replace denk ik een stuk beter dynamisch opbouwen, net zoals het pattern, aan de hand van de informatie in je tabel. Als je letterlijk <b>woord</b> opslaat, zal PRCE natuurlijk letterlijk daardoor replacen.
-NMe- schreef op vrijdag 14 april 2006 @ 20:16:
[b]woord[/b] is helemaal geen regexp en kan simpelweg niet werken? :? [b] is een character class met één letter, dus dat matcht alleen op "b". [/b] is een character class met alleen "/" of "b" erin. Uiteindelijk zou [b]woord[/b] als regexp alleen matchen op "bwoordb" of "bwoord/". Ware het niet dat er uit je voorbeeld ook nog eens de delimiters ontbreken. 8)7
Weet ik wel... :) Bij voorbeeld staat toch (tussen haakjes) "zonder gebruik te maken van de opmaak die nodig is voor preg_replace() "

Mijn tabel ziet er trouwens zo uit: ( heb de regel met [b] tag genomen, voor de duidelijkheid)
code:
1
2
3
4
5
id      | 1
-------------------------------------------
code    | #\\[b\](.*?)\\[/b\]#si
-------------------------------------------
vervang | <b>\\1</b>
Deze code heb ik letterlijk overgenomen uit mijn vroegere arrays, die zoals eerder gezegd wel werkten...
Gonadan schreef op vrijdag 14 april 2006 @ 11:36:
Sla [ b] en [ /b] apart op, dan ben je er van af :)

Het enige nadeel is dat de gebruiker makkelijker fouten kan maken.
Wel een goed idee, maar als een gebruiker een tag vergeet af te sluiten staat wel de rest van de pagina onderlijnd, vet, schuin of hyperlink.
Ik zou aan het einde van tekststring automatisch alle sluittags kunnen laten volgen, maar dat vind ik vrij omslachtig... Ook heb ik niet echt veel zin of inspiratie om een controle te laten uitvoeren om te zien dat alle tags goed zijn afgesloten, want bij die controle komt waarschijnlijk hetzelfde probleem als hier opdagen... ;(
-NMe- schreef op vrijdag 14 april 2006 @ 20:16:
Sla in je tabel "\\[b\](.*)\\[/b\]" op als pattern, en "<b>\\1</b>" als replacement. Maak dan van regel 5 in je code het volgende:
PHP:
5
$subject = preg_replace('#'.$waarde['ubbcode'].'#Ui', $waarde['vervang'], $subject);

Dat doet waarschijnlijk al meer. Let wel dat ik $text_out eruit gegooid heb omdat je anders continu alle replaces overschrijft. 8)7 En als je error_reporting op E_ALL had gehad staan, dan had je die andere "fout" op regel 5 ook gezien. ;)
Dit snap ik niet helemaal... Maar ik zal het proberen... :)

offtopic:
Weet iemand misschien nog een site waar ik eventueel uitleg kan vinden over php functies? Want bij de functie in kwestie vind ik de uitleg van php.net moeilijk om te begrijpen...


edit : typo

[ Voor 11% gewijzigd door Elvis op 15-04-2006 00:42 ]

[GoT] TF2 Clan


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Elvis schreef op zaterdag 15 april 2006 @ 00:37:
Mijn tabel ziet er trouwens zo uit: ( heb de regel met [b] tag genomen, voor de duidelijkheid)
code:
1
2
3
4
5
id      | 1
-------------------------------------------
code    | #\\[b\](.*?)\\[/b\]#si
-------------------------------------------
vervang | [nohtml]<b>\\1</b>[/nohtml]
Deze code heb ik letterlijk overgenomen uit mijn vroegere arrays, die zoals eerder gezegd wel werkten...
Hmm, ik zou die delimiters eruit laten, en de modifiers ook. Die lijken me namelijk voor elke code hetzelfde en zouden dus gewoon in je code moeten staan. Sla dus liever "\\[b\](.*?)\\[/b\]" op en gebruik verder mijn suggestie als je je database schoner wilt krijgen. :)
Dit snap ik niet helemaal... Maar ik zal het proberen... :)
Wat valt eraan te snappen dan? :) Je schreef steeds het resultaat van de replace weg naar een variabele, maar elke volgende replace overschreef die variabele weer, waardoor je de eerdere replaces teniet doet. Bij replaces is de bron doorgaans hetzelfde als het doel, als je tenminste méér dan één replace wil uitvoeren op dezelfde string.
offtopic:
Weet iemand misschien nog een site waar ik eventueel uitleg kan vinden over php functies? Want bij de functie in kwestie vind ik de uitleg van php.net moeilijk om te begrijpen...
Duidelijker dan PHP.net zul je het niet krijgen ben ik bang. En zò moeilijk is die manual toch niet? Het is een van de betere manuals die ik ooit gezien heb voor een programmeertaal, en dat is een heel statement voor een taal die van zichzelf uit nogal wat rare ontwerpkeuzes met zich meebrengt. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Elvis
  • Registratie: Juli 2002
  • Laatst online: 18-11-2017

Elvis

Echo Lima Victor India Sierra

Topicstarter
(jarig!)
Ik heb al je suggesties op de letter gevolgd -NMe-, doch werkt het nog niet...

M'n output is nu : \1
Ik zal alles nog eens dubbelchecken op eventuele fouten...

PS : sorry voor de late reactie, ik had dit weekend nogal weinig tijd...

EDIT : heb bij wijze van probeersel één backslash weggehaald bij de replacement...
guess what... :) Om één of andere (voor mij) onduidelijke) reden werkt het nu... 8)7
Bedankt voor al jullie hulp!

[ Voor 30% gewijzigd door Elvis op 19-04-2006 11:35 ]

[GoT] TF2 Clan

Pagina: 1