login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Regex

Offline Voldemort - 30/12/2006 21:51
Avatar van VoldemortPHP ver gevorderde Beste,

Ik heb altijd al problemen met Regex gehad, maar nu zou ik een regex willen die enkel A-Za-z0-9, spaties en _ mag hebben. Nu dacht ik te werken met [A-Za-z0-9], maar hoe pas ik die spatie en die _ erin? En moet ik dan nog dingen als ^, +, * of dergelijke dingen toevoegen? Met welke functie moet ik het gebruiken? Kan iemand me helpen met deze regex?

Mvg.

33 antwoorden

Gesponsorde links
Offline Dolfje - 30/12/2006 21:53 (laatste wijziging 30/12/2006 21:53)
Avatar van Dolfje Gouden medailleGouden medailleGouden medaille

PHP ver gevorderde
Je moet die dingen unescapen:
zo dus: [a-zA-Z0-9_\-\ ]
Offline Voldemort - 30/12/2006 22:07
Avatar van Voldemort PHP ver gevorderde Was er voor spatie niet zoiets als [:SPATIE:] ofzoiets?

Dus deze code moet werken:

  1. if(!eregi_replace('[a-zA-Z0-9_\ ]',$username))
  2. echo 'error';


Zo zal ie dus werken als ik enkel letter, cijfers (hoofdletterongevoelig), spaties en underscrores (of hoe je dat ook typt, ik bedoel _) wil? Of ben ik verkeerd?
Offline MindPrison - 30/12/2006 22:36 (laatste wijziging 30/12/2006 22:36)
Avatar van MindPrison PHP gevorderde
  1. <?php
  2. if(!preg_match("^[\w ]+$", $username))
  3. echo "error";
  4. ?>
Offline Voldemort - 30/12/2006 23:14
Avatar van Voldemort PHP ver gevorderde @MindPrison: Dan krijg ik:

Citaat:
Warning: preg_match() [function.preg-match]: No ending delimiter '^' found in /home/quinten/www/regex.php on line 4
Offline dotPixel - 30/12/2006 23:22 (laatste wijziging 30/12/2006 23:24)
Avatar van dotPixel PHP interesse
  1. <?php
  2. if (preg_match("#^([\w\s-]+)$#", $username) == false) {
  3. echo 'error';
  4. } ?>


Probeer dit eens. 
Offline Wijnand - 31/12/2006 08:57
Avatar van Wijnand Moderator Je moet goed op de errors letten. No ending delimiter betekend dat je een begin en eind "delimiter" bent vergeten.

Dat is een character die aan het begin en an het eind staat (random heeft hiervoor # gebruikt). Dit zorgt ervoor dat je extra argumenten (modifiers) kan geven bijvoorbeeld:

/.../i (/ = de delimiter, ... is de pattern van je regexp en i is het argument (modifier). )

Verder moet je dit alleen gebruiken bij preg_ functions en niet bij ereg functies. preg_ is een stuk beter, en dan moet je dus met delimiters werken.

hier nog even 2 leuke links:
http://nl3.php....ifiers.php
http://nl3.php....syntax.php

Offline MindPrison - 31/12/2006 10:02 (laatste wijziging 31/12/2006 10:05)
Avatar van MindPrison PHP gevorderde Ik was inderdaad de / vergeten. Dom van me...
  1. <?php
  2. if(!preg_match("/^[\w ]+$/", $username))
  3. echo "error";
  4. ?>

Dit werkt het wel zeker?
Pas wel op met '\s', want dan worden ook tabs ect. toegelaten.
Offline Voldemort - 31/12/2006 10:53 (laatste wijziging 31/12/2006 11:18)
Avatar van Voldemort PHP ver gevorderde 1) Die code van MindPrison werkt perfect. Even nog een vraag, is deze regex een goede om op geldige mails te controleren?

  1. <?php
  2. if(!eregi("[A-Za-z0-9_-]+([\.]{1}[A-Za-z0-9_-]+)*@[A-Za-z0-9-]+([\.]{1}[A-Za-z0-9-]+)+" ,$mail))
  3. echo 'error';
  4. ?>


Deze heb ik ergens gevonden, een hele tijd geleden. Is deze goed?

2) En als ik bij die regex ivm die username's, als ik daar ook nog een - wil toelaten, moet ik dan gewoon die - toevoegen, of wordt dat \-?
Offline MindPrison - 31/12/2006 11:22 (laatste wijziging 31/12/2006 11:26)
Avatar van MindPrison PHP gevorderde 1) Dit gebruik ik (het test ook de host), je e-mail adres moet dan wel volledig lowercase zijn:
  1. <?php
  2. function check_email($email)
  3. {
  4. if(preg_match("/^[_a-z0-9\-]+(\.[_a-z0-9\-]+)*@[a-z0-9\-]+(\.[a-z0-9\-]+)*(\.[a-z]{2,3})$/", $email))
  5. {
  6. $host = explode("@", $email);
  7. if(checkdnsrr($host[1] . ".", "MX")) return TRUE;
  8. if(checkdnsrr($host[1] . ".", "A")) return TRUE;
  9. if(checkdnsrr($host[1] . ".", "CNAME")) return TRUE;
  10. }
  11.  
  12. return FALSE;
  13. }
  14. ?>


2) Dit wordt dan:
  1. <?php
  2. if(!preg_match("/^[\w\- ]+$/", $username))
  3. echo "error";
  4. ?>
Offline Voldemort - 31/12/2006 22:09 (laatste wijziging 02/01/2007 10:46)
Avatar van Voldemort PHP ver gevorderde Die username werkt perfect, die andere heb ik nog niet getest. Maar ik heb een nieuw probleem:

  1. <?php
  2. function parse_img($tekst,$img_w)
  3. {
  4. if(preg_match('#\[img\](http://)(.*?)\[/img\]#i',$tekst,$matches))
  5. {
  6. $url = $matches[1].$matches[2];
  7.  
  8. //Alle gegevens weergeven
  9. if(list($width,$height,$type,$attr) = @getimagesize($url))
  10. {
  11. //Als de hoogte van het origineel groter is dan het toegestane
  12. if($width > $img_w)
  13. {
  14. $deel = $width/$img_w; //Breedte delen door maximum
  15. $kl_wi = $width/$deel; //Maximale breedte delen door de factor $deel
  16. $kl_he = $height/$deel; //Maximale hoogte delen door de factor $deel
  17. $ok_wi = floor($kl_wi); //Maximale breedte afronden naar onder, dit is de breedte die we geven aan het verkleinde
  18. $ok_he = floor($kl_he); //Maximale hoogte afronden naar onder, dit is de hoogte die we geven aan het verkleinde
  19. }
  20. //Anders is de breedte niet overschreden
  21. else
  22. {
  23. $ok_wi = $width; //De breedte is het origineel (er moest immers niks veranderen)
  24. $ok_he = $height; //De hoogte is het origineel (er moest immers niks veranderen)
  25. }
  26.  
  27. //Vervang
  28. $tekst = preg_replace('#\[img\](http://)(.*?)\[/img\]#i','<a href="'.$url.'" target="_blank"><img src="'.$url.'" width="'.$ok_wi.'" height="'.$ok_he.'" border="0" alt="Image" /></a>', $tekst);
  29. }
  30. else
  31. $tekst = preg_replace('#\[img\](http://)(.*?)\[/img\]#i','[Image bestaat niet]', $tekst); //Anders gewoon laten
  32. }
  33.  
  34. return $tekst;
  35. }
  36. ?>


Als je dan dit doet:

[img]http://img1.png[/img]
[img]http://img2.png[/img]

Dan krijg je 2 keer img1.png te zien ipv een keer img1.png en een keer img2.png. Die 1e if in een while veranderen helpt niks. Wat doe ik fout?

Edit: Niemand? Echt niemand?
Offline Ibrahim - 02/01/2007 11:53
Avatar van Ibrahim PHP expert
  1. <?php
  2. function parse_img($tekst,$img_w)
  3. {
  4. if(preg_match_all('#\[img\](http://)(.*?)\[/img\]#i',$tekst,$matches))
  5. {
  6. foreach($matches[1] as $key => $http)
  7. {
  8. $url = $matches[1][$key] . $matches[2][$key];
  9. //Alle gegevens weergeven
  10. if(list($width,$height,$type,$attr) = @getimagesize($url))
  11. {
  12. //Als de hoogte van het origineel groter is dan het toegestane
  13. if($width > $img_w)
  14. {
  15. $deel = $width/$img_w; //Breedte delen door maximum
  16. $kl_wi = $width/$deel; //Maximale breedte delen door de factor $deel
  17. $kl_he = $height/$deel; //Maximale hoogte delen door de factor $deel
  18. $ok_wi = floor($kl_wi); //Maximale breedte afronden naar onder, dit is de breedte die we geven aan het verkleinde
  19. $ok_he = floor($kl_he); //Maximale hoogte afronden naar onder, dit is de hoogte die we geven aan het verkleinde
  20. }
  21. //Anders is de breedte niet overschreden
  22. else
  23. {
  24. $ok_wi = $width; //De breedte is het origineel (er moest immers niks veranderen)
  25. $ok_he = $height; //De hoogte is het origineel (er moest immers niks veranderen)
  26. }
  27.  
  28. //Vervang
  29. $tekst = str_replace('[img]'.$url.'[/img]','<a href="'. $url .'" target="_blank"><img src="'. $url .'" width="'.$ok_wi.'" height="'.$ok_he.'" border="0" alt="Image" /></a>', $tekst);
  30. }
  31. else
  32. {
  33. $tekst = preg_replace('#\[img\](http://)(.*?)\[/img\]#i','[Image bestaat niet]', $tekst); //Anders gewoon laten
  34. }
  35. }
  36. }
  37.  
  38. return $tekst;
  39. }
  40. ?>


alstu
Offline Voldemort - 02/01/2007 12:20
Avatar van Voldemort PHP ver gevorderde Die doet het, er is alleen 1 probleem, als de image niet bestaat krijg ik een error:

  1. getimagesize(http://localhost/hp-d_v30/images/lay-out/hermoine/headerI8765.jpg) [function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found


Waarom onderdrukt ie @ dat niet? En hoe los ik het op?
Offline Ibrahim - 02/01/2007 14:00
Avatar van Ibrahim PHP expert bij mij onderdrukt hij hem wel hoor
Offline Voldemort - 02/01/2007 18:14 (laatste wijziging 04/01/2007 09:58)
Avatar van Voldemort PHP ver gevorderde Hier niet, op localhost niet en online ook niet:

getimagesize(http://www.harrypotter-dreuzels.com/images/lay-out/header.jpg) [function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found

Waarom werkt de @ niet? Kan er geen andere manier, bv. het url checken of het klopt (die @ is zo smerig)? Hoe?

Edit: Niemand?
Offline Simon - 04/01/2007 10:05 (laatste wijziging 04/01/2007 10:16)
Avatar van Simon PHP expert net voor de die list() doet een if'je met file_exists() ?

edit @ hieronder: ohja, dacht dat het om upgeloade afbeeldingen ging 
Offline Kr4nKz1n - 04/01/2007 10:10
Avatar van Kr4nKz1n Onbekend Volgens mij werk file_exists alleen intern. Dus als je een plaatje van een andere site af haald heeft dit geen enkele nut.
Offline Voldemort - 04/01/2007 10:11
Avatar van Voldemort PHP ver gevorderde file_exists is toch enkel voor op je eigen server (dit denk ik toch al ik de PHP.net pagina van file_exists lees)? Deze images kunnen ook van imageshack zijn of dergelijke.
Offline Simon - 04/01/2007 10:19 (laatste wijziging 04/01/2007 10:20)
Avatar van Simon PHP expert file_get_contents, ob_get_contents kunnen wel van andere bestanden lezen, maar die zullen waarschijnlijk ook errors geven
  1. if(!file_get_contents($url)) {
  2. echo 'error';
  3. }
  4. else {
  5. //voortdoen
  6. }
benieuwd of die ook een php error zullen geven
Offline Voldemort - 04/01/2007 20:10 (laatste wijziging 06/01/2007 12:16)
Avatar van Voldemort PHP ver gevorderde file_get_contents geeft dezelfde error als getimagesize (error 404). Wat kan ik eraan doen?

Edit: Niemand? Echt niemand?
Offline Stijn - 06/01/2007 12:39
Avatar van Stijn PHP expert probeer dit eens:
  1. <?
  2. if( ($fp = fopen( $url , 'r' ) ) === false ) {
  3. echo "error";
  4. } else {
  5. echo "file bestaat";
  6. }
  7.  
  8. fclose( $fp );
  9. ?>


stijn
Offline Voldemort - 06/01/2007 14:22 (laatste wijziging 06/01/2007 14:24)
Avatar van Voldemort PHP ver gevorderde @stijn1989: Dan komt er:

  1. fopen(http://localhost/hp-d_v30/images/lay-out/hermoine/headerI8765.jpg) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found


En een soortgelijke error voor fclose.
Offline Ibrahim - 06/01/2007 16:34
Avatar van Ibrahim PHP expert zet dan bovenaan: error_reporting(0); om errors te onderdrukken. Niet een nette manier, maar wel handig voor jou.
Offline Voldemort - 06/01/2007 16:55
Avatar van Voldemort PHP ver gevorderde Die manier gebruik ik niet, ik zet hem op error_reporting(E_ALL) om zo alle errors te krijgen. set_error_handler() mailt die dan naar mij door, daarom dat ik dat liever niet doe.

Is er geen optie met fsockopen of zoiets?
Offline Stijn - 06/01/2007 19:24
Avatar van Stijn PHP expert kijk in de streaming functies , er is net een tutorial gepost door marten
Offline Voldemort - 07/01/2007 11:39
Avatar van Voldemort PHP ver gevorderde M'n host draait geen PHP 5 (PHP 4.4.4), dus die stream functies zijn niet echt een optie. Ik weet dat ze er al zijn van PHP 4.3.0, maar in die tutorial staat alles al met PHP 5 functies uitgelegd. Is er toch een optie om met streams in PHP 4.4.4 te werken die doen wat ik wil?
Offline Ibrahim - 07/01/2007 11:47
Avatar van Ibrahim PHP expert Weet je zeker dat die @ de fout niet onderdrukt ?
Offline Voldemort - 07/01/2007 12:36 (laatste wijziging 10/01/2007 14:07)
Avatar van Voldemort PHP ver gevorderde Ja, dat ben ik zeker.

Edit: Niemand?
Offline Ibrahim - 10/01/2007 17:46
Avatar van Ibrahim PHP expert ja, wat verwacht je dan ? Bij mij onderdrukt ie hem prima en bij jou niet. Dan denk ik dat het iets met php.ini te maken heeft ofzo.
Offline TotempaaltJ - 10/01/2007 18:17
Avatar van TotempaaltJ PHP interesse Misschien domme opmerking, maar wat is Regex?
Offline Ibrahim - 10/01/2007 18:22
Avatar van Ibrahim PHP expert reguliere expressies, een bekende afkorting. Daarmee kun je een tekst zeg maar doorzoeken op een bepaalde opdracht.

www.regular-expressions.info als je het wilt leren.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.328s