[PHP] Function call in preg_replace (UBB-code)

Pagina: 1
Acties:
  • 108 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wat wil ik?
[news=id] converten in <a href="news_link/id">news_title</a>

Wat heb ik gedaan
Eerst een functie geschreven die de nieuws titel uit de databae haalt
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function get_news_title($id)
{
    .
    .
    .
    $sql = "SELECT * FROM {$table_news} WHERE news_id = '$id'";
                $result = mysql_query($sql, $db);
    if(!$result)
        return false;
    $row = mysql_fetch_array($result);
    return  stripslashes($row['news_title']);
}


En ...
PHP:
1
2
3
4
5
6
function encode($text)
{
    $text = preg_replace("#\\[news=([0-9]+?)\]#si", 
'<a href="' . $url_news . '\1" target="_blank">' . get_news_title('\1') . '</a>',$text);
    return $text;
}

Verder zijn alle variabelen netjes gedefinieerd enzo.


Wat is het probleem?
get_news_title retouneert altijd de titel van nieuws met news_id = 1.

Vb.
[news=293993] -> <a href="url/id">van nieuws met news_id = 1.</a>

Je zou dus denken dat bij het aanroepen van get_news_title $id = $1 = 1
Nou dat heb ik dus getest. Ik liet get_news_title alleen de $id returnen en dan krijg je wel de goede id. :?

m.a.w. get_news_title krijgt wel de goede id mee, en de sql dus ook, maar bij de database call wordt $id als 1 opgevat.

Ik loop al de hele dag te kutten maar ik kom er niet uit :'(

Search leverde soortgelijke topics op maar geen antwoord

[ Voor 36% gewijzigd door Verwijderd op 23-03-2004 13:26 ]


Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
[code]$sql = "SELECT news_title FROM {$table_news} WHERE news_id = ".$id.""; [/code]

Doe je nog wat meer met $id? Want zoals je laat voorkomen geef je niet de hele functie get_news_title($id).
never mind. beter lezen |:(

[ Voor 23% gewijzigd door TRON op 23-03-2004 13:41 ]

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • DizzyWeb
  • Registratie: Februari 2001
  • Laatst online: 05-09 14:30

DizzyWeb

Ondertiteld

Volgens de manual moet je daar de /e modifier voor gebruiken... Anders gebruikt ie die function call gewoon niet.

Acties:
  • 0 Henk 'm!

Verwijderd

Je kunt ook preg_replace_callback gebruiken, is wel wat langzamer misschien, maar dat weet ik niet zeker moet je maar kijken.

En \1 als backreference is deprecated, het gebruik van $1 wordt nu aangeraden.

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Volgens mij gaat dat niet zo als jij het wilt.
Als je de \1 in een functiecall wilt gebruiken, dien je zowieso al de /e modifier te gebruiken voor je regex, en kun je volgens mij alleen maar de functie callen.
het zou dus zoiets moeten worden (ongetest)
PHP:
1
2
3
4
5
6
7
8
9
10
11
function encode($text) 
{ 
    $text = preg_replace("/\\[news=([0-9]+?)\]/sie", "get_news_title(\\1)",$text); 
    return $text; 
}

function get_news_title($id){
    // alles voor dit id ophalen.....
   $rv='<a href="' . $url. '\1" target="_blank">' . $title . '</a>';
   return($rv);
}

Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
Guys, hij zegt dat als hij het $id laat returnen door get_news_title, dat dan WEL het goede ID gereturned wordt ;) beter lezen 8)7

[ Voor 10% gewijzigd door TRON op 23-03-2004 13:40 ]

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • DizzyWeb
  • Registratie: Februari 2001
  • Laatst online: 05-09 14:30

DizzyWeb

Ondertiteld

Als het goed is hoef je alleen die e erbij te zetten...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
huh?

Die functie (get_news_title) wordt wel aangeroepen en binnen die functie heeft $id de juiste waarde.

Voorbeeld:
Als de text [news=122] bevat dan wordt de aangeroepen en is:

$id = 122 [GOED]
$sql = SELECT * FROM news WHERE news_id = '122' [GOED]

Alleen bij de database call gaat het mis, kennelijk ziet 'ie $id niet als integer ik heb intval geprobeerd maar die returnt 0. :S

[ Voor 6% gewijzigd door Verwijderd op 23-03-2004 13:48 ]


Acties:
  • 0 Henk 'm!

Verwijderd

beetle71 schreef op 23 maart 2004 @ 13:36:
PHP:
1
2
    $text = preg_replace("/\\[news=([0-9]+?)\]/sie",
 "get_news_title(\\1)",$text);
Dit gaan anders ook niet werken hoor, nu komt er in de tekst "get_news_title(id)" te staan...en dat is denk ik ook niet wat de TS wil :+
news_id = '122'
Om een numerieke waarde moeten geen quotes :P

[ Voor 24% gewijzigd door Verwijderd op 23-03-2004 13:47 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
beetle71 schreef op 23 maart 2004 @ 13:36:
PHP:
1
2
3
4
5
function encode($text) 
{ 
    $text = preg_replace("/\\[news=([0-9]+?)\]/sie", "get_news_title(\\1)",$text); 
    return $text; 
}
No way dat dat werkt, $id zal vervangen worden door de string get_news_title($id)

[ Voor 5% gewijzigd door Verwijderd op 23-03-2004 13:56 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Probeer eens te achterhalen wat de volgorde is waarin de verschillende functies worden uitgevoerd. De get_news_title('\1') wordt namelijk eerst uitgevoerd en dit wordt in de string geplakt die aan de regexp functie wordt meegegeven. Zet voor de grap maar eens een \1 in de titel van het nieuws met id 1 dan zul je zien dat daar de werkeleijke nieuwesid wordt ingevuld.

Om functies in een reguliere expressie te gebruiken heb je de e modifier nodig. Zie voor meer info hier.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op 23 maart 2004 @ 13:54:
[...]

No way dat dat werkt, $id zal vervangen worden door de string get_news_title($id)
Al geprobeert dan?


@beetle : Laat je niet gek maken hoor :).. Je kunt trouwens wel extra tekst gebruiken, maar dan moet je ze binnen ' zetten. De 2e string wordt als het ware 'ge-eva-led'. Je zou iets als "'ervoor'.functie(\\1).'erna'" moeten gebruiken.

[ Voor 35% gewijzigd door Janoz op 23-03-2004 14:07 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Verwijderd schreef op 23 maart 2004 @ 13:46:
[...]

Dit gaan anders ook niet werken hoor, nu komt er in de tekst "get_news_title(id)" te staan...en dat is denk ik ook niet wat de TS wil :+
Verwijderd schreef op 23 maart 2004 @ 13:54:
[...]

No way dat dat werkt, $id zal vervangen worden door de string get_news_title($id)
Voor deze personen.... Als je iets roept, zorg dan dat het klopt :(

Het gegeven voorbeeld werkt wel degelijk !

edit:
THnx Janoz!, dat dacht ik ook :P

[ Voor 6% gewijzigd door beetle71 op 23-03-2004 14:07 ]


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Patrick83:
No way dat dat werkt, $id zal vervangen worden door de string get_news_title($id)
Probeer het eerst eens uit. beetle71 heeft namelijk wel gelijk.

edit:
spuit169

[ Voor 5% gewijzigd door drm op 23-03-2004 14:06 ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
beetle71 schreef op 23 maart 2004 @ 14:06:
[...]


[...]


Voor deze personen.... Als je iets roept, zorg dan dat het klopt :(

Het gegeven voorbeeld werkt wel degelijk !

edit:
THnx Janoz!, dat dacht ik ook :P
Solly, je hebt gelijk.

Het werkt nu. _/-\o_ _/-\o_ _/-\o_

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thanx Janoz & beetle71 _/-\o_
Pagina: 1