login  Naam:   Wachtwoord: 
Registreer je!
 Forum

preg_replace in combinatie met een query (Opgelost)

Offline cowb - 09/11/2011 18:22 (laatste wijziging 09/11/2011 18:50)
Avatar van cowbLid dag allemaal.

Ik ben mijn ubb script wat aan het uitbreiden en ik zit met een klein probleemje. Ik wil graag bij deze combinatie "@Gebruikersnaam:" de gebruikersnaam vervangen door een link naar hun infopagina. Maar afhankelijk van hun status kies ik de juiste css style voor mijn <a> tag. Dit doe ik doormiddel van een mysql query... Maar, ik krijg nooit een match, ook al weet ik dat de gebruikersnaam bestaat.

(code zegt veel meer)
  1. //Dit zijn in mijn UBB functies
  2. $string = preg_replace("#@([a-z0-9_\#\?\.&/]*):#is", "@".GebruikersnaamOmzetten("\\1").": ",$string);
  3.  
  4. //Dit is mijn extra gemaakte functie
  5. function GebruikersnaamOmzetten($GebruikersNaam)
  6. {
  7. $QueryGebruikersGegevens = mysql_query("SELECT * FROM gebruikers WHERE gebruikersnaam='".$GebruikersNaam."'");
  8.  
  9. if(mysql_num_rows($QueryGebruikersGegevens) == 1)
  10. {
  11. $Gebruiker = mysql_fetch_array($QueryGebruikersGegevens, MYSQL_BOTH);
  12. return print_gebruikersnaam($Gebruiker['ID']);
  13. }
  14. else
  15. {
  16. return $GebruikersNaam;
  17. }
  18. }


Moet ik één of andere conversie uitvoeren alvorens hij zou matchen. Het werk echter wel als ik $gebruikersnaam vervang door gebruikersnaam. (bijvoorbeeld GebruikersnaamOmzetten("Mathieu");)

6 antwoorden

Gesponsorde links
Offline WouterJ - 09/11/2011 18:58
Avatar van WouterJ HTML gevorderde 1) Zou je misschien je [/php] willen vervangen door [/code]?
2) Gebruik geen *, maar selecteer wat je wilt. Dit is overzichtelijker en sneller
3) Gebruik een PHP.net: while loop en PHP.net: mysql_fetch_assoc i.p.v. de array. Dit is namelijk onnodig en kost veel tijd.
4) Gebruik PHP.net: mysql_real_escape_string bij alle variabelen in een query die een string zijn en die aangepast kunnen worden door een gebruiker (superglobals of afgeleide daarvan)
5) Controleren of de query is gelukt moet je als eerst doen met kijken of er geen false is gereturned $deQuery !== 'false' of !$deQuery
6) De match werkt wel gewoon, dus er zit een fout bij het aanroepen van de functie. Ik kan het nu niet uittesten, dus misschien weet een ander het probleem.
Offline cowb - 09/11/2011 20:14
Avatar van cowb Lid Bedankt voor je snelle reactie!

1) Ik heb de ubb tag gebruikt bovenaan het veld. Dus als er [/php] ipv [/code] stond dan is dat een bug.
2) / 3) Aangepast, sorry voor de tijdverspilling.
4) Heb dit ook ingevoegd, maar maakte jammer genoeg geen verschil uit.
5) Maakt dat zoveel verschil uit. Ik doe gewoon mysql_num_rows() wanneer dat == aan nul , dan weet ik dat er iets loos is...
6) Het aanroepen van de functie doe ik zoals hierboven aangegeven heb...
  1. $string = preg_replace("#@([a-z0-9_\#\?\.&/]*):#is", "@".GebruikersnaamOmzetten("\\1").": ",$string);


Wanneer ik echter dit doe, om even de boel te testen, dan werkt het wel...
  1. $string = preg_replace("#@([a-z0-9_\#\?\.&/]*):#is", "@".GebruikersnaamOmzetten("Mathieu").": ",$string);


Wat is hier de verklaring voor?
Offline Sam - 09/11/2011 23:15 (laatste wijziging 09/11/2011 23:16)
Avatar van Sam PHP expert Omdat het zo niet werkt.

Bekijk dit eens: PHP.net: preg_replace_callback Net dezelfde functie, maar in plaats van te replacen door een string wordt de callback functie uitgevoerd.

  1. $string = preg_replace_callback("#@([a-z0-9_\#\?\.&/]*):#is", "GebruikersnaamOmzetten",$string);

Je zal de @ en de : wel in de functie moeten toevoegen dan.
Bedankt door: cowb
Offline WouterJ - 09/11/2011 23:44
Avatar van WouterJ HTML gevorderde Je moet voor het aanroepen van een functie preg_replace_callback gebruiken. Ik heb even snel een voorbeeld code gemaakt, die kun je hier vinden: http://snipplr....-ubbparser/
Offline Maarten - 10/11/2011 13:18
Avatar van Maarten Erelid Ik heb nog een opmerking die geen rechtstreeks antwoord is op je vraag, maar toch niet onbelangrijk is.
Zou het geen beter idee zijn om ergens op een globaal niveau een 'cache' op te bouwen, die gebruikersnamen matcht met hun 'output'? Stel dat dezelfde username een aantal keer voorkomt op je pagina, dan zal dat telkens resulteren in een query.
Simpelweg kan dat gewoon een statische klasse zijn die een array gaat bijhouden van gebruikersnamen en de URL naar hun profiel met inbegrip van de opmaak.

Verder stel ik mij de vraag bij de match van gebruikersnaam. Welke tekens zijn allemaal toegestaan in deze namen? Aangezien spaties niet lijken toegestaan, lijkt het mij sterk dat iemand #, ?, &,... kan gebruiken in zijn gebruikersnaam?
Offline cowb - 10/11/2011 21:06
Avatar van cowb Lid @Waldio: Bedankt voor je voorbeeld! Het werkt perfect!

@Maarten: Goeie opmerking, maar uiteindelijk is dat maar een gadget die niet super veel gebruikt word op dezelfde pagina... Dus dat zal nog wel meevallen denk ik.
Maar wat je als laatste aanhaalt is wel van belang. Speciale tekens zijn inderdaad niet toegestaan. Maar ook niet bij het aanmaken van een account. Dus mocht iemand @#*&: invoeren, dan zal dit resulteren in een false bij de query, en wordt er niks afgebeeld. Wat normaal is want zoiets zit niet in de db. Dus er is geen probleem toch?
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.259s