Toon posts:

[Regexp] Woorden splitten op komma

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

Verwijderd

Topicstarter
Beste Tweakers(ters),

Ik ben bezig aan een klein scriptje, waarbij je woorden gescheiden door een komma in een textfield moet invullen. Nu wil ik met PHP controleren of het ingevulde alleen letters en/of cijfers bevat of een komma of meerdere, en ik heb van alles geprobeerd maar kom er niet echt uit (ben ook niet zo heel erg bekend met regexen)

Uitprobeersels:
PHP:
1
preg_match( '[(a-z)|(0-9)|(,)]',$_POST['trefwoorden'] )

Ik dacht dat dit betekende: of letters of cijfer of komma.
Echter geeft hij false als ik maar 1 trefwoord invul, als ik meerdere trefwoorden invul gescheiden door een komma vindt hij dat weer wel goed.

PHP:
1
preg_match( '[(a-z)|(0-9)](*,)',$_POST['trefwoorden'] )

Ik dacht, de komma mag 0 of meer keer voorkomen? Echter geeft hij de volgende foutmelding:
Warning: preg_match() [function.preg-match]: Unknown modifier '(' in D:\xampplite\htdocs\kees\Bestaande applicaties\verzeker-co.nl\edit.php on line 1351

Is er iemand die me misschien kan helpen?

[ Voor 4% gewijzigd door Verwijderd op 22-09-2005 11:02 . Reden: code foutje :P ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 16:04

crisp

Devver

Pixelated

PHP:
1
2
3
4
5
6
7
8
if (preg_match('/^[a-zA-Z0-9,]+$/', $_POST['trefwoorden']))
{
  echo 'geldig';
}
else
{
  echo 'niet geldig';
}

[ Voor 7% gewijzigd door crisp op 22-09-2005 11:12 ]

Intentionally left blank


  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

Gebruik de volgende regexp:
PHP:
1
preg_match( '([a-zA-Z0-9]+)(?:,)?', $_POST['trefwoorden'] )

Je wilt namelijk dat je trefwoorden uit letters en/of cijfers bevatten, en dat er eventueel een komma achter een "woord" staat. Maar de komma is optioneel (anders kun je geen losse woorden invoeren).

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

crisp schreef op donderdag 22 september 2005 @ 11:05:
PHP:
1
2
3
4
5
6
7
8
if (preg_match('/^[a-zA-Z0-9,]$/', $_POST['trefwoorden']))
{
  echo 'geldig';
}
else
{
  echo 'niet geldig';
}
Da's niet echt handig, want nu kan ik ook "a,,,,b" als invoer geven, en dat lijkt mij niet echt gewenst dat dit als correcte invoer behandeld wordt...

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 16:04

crisp

Devver

Pixelated

JaWi schreef op donderdag 22 september 2005 @ 11:10:
[...]


Da's niet echt handig, want nu kan ik ook "a,,,,b" als invoer geven, en dat lijkt mij niet echt gewenst dat dit als correcte invoer behandeld wordt...
Dat ligt er aan wat je er daarna mee doet; als je een preg_split gebruikt met PREG_SPLIT_NO_EMPTY maakt dat natuurlijk niets uit...
Anders zou je nog zoiets kunnen doen:

/^([a-zA-Z0-9]+,?)+$/

[ Voor 8% gewijzigd door crisp op 22-09-2005 11:14 ]

Intentionally left blank


Verwijderd

Topicstarter
Voor de volledigheid hier het volledige blokje code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
if( !empty( $_POST['trefwoorden'] ) ) 
{
      if( preg_match( '[(a-z)|(0-9)](*,)',$_POST['trefwoorden'] ) )            
      {      
            foreach( explode(',',$_POST['trefwoorden']) AS $trefwoord ) 
            {
                  trim($trefwoord);
                  if( !empty( $trefwoord) ) 
                  {
                        $sql = 'SELECT id FROM verklaring_trefwoorden WHERE trefwoord="'.$trefwoord.'"';                  
                        if( !mysql_num_rows( mysql_query($sql) ) ) 
                        {
                              mysql_query('INSERT INTO verklaring_trefwoorden (src_id,trefwoord) VALUES ("'.$_GET['verklaringid'].'","'.trim($trefwoord).'")');
                        }
                        else
                        {
                              $str .= 'Trefwoord: '.$trefwoord.' bestaat al!<br>';                        
                        }                        
                  }
            }
            mysql_query( 'INSERT INTO verklaring (titel,omschrijving) VALUES("'.$_POST['titel'].'","'.$_POST['omschrijving'].'")');      
            $str .= 'De verklaring is toegevoegd.<br>';
      }
      else
      {
            $str .= 'De manier dat u de trefwoorden heeft ingevuld is ongeldig.'; 
      }
}


Overigens denk ik niet dat het zo erg is als je bijvoorbeeld "woord,,,,woord invoert" aangezien hij een array van maakt (split op de komma) en ik controleer zelf in de foreach loop ook nog of het huidige element leeg is.

Zowiezo iedereen bedankt voor de reacties!, ik zal het e.e.a proberen :)

[ Voor 21% gewijzigd door Verwijderd op 22-09-2005 11:22 ]


  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 23-04 13:07
kan je niet beter eerst een explode(',',$_POST['trefwoorden']) doen zodat je een array met alle entries gescheiden door een komma krijgt en in een for loopje de trefwoorden gaan valideren met eventueel een reg expression?

edit:

Oh, zo iets doe je dus al, ik was te laat.

[ Voor 18% gewijzigd door stekkel op 22-09-2005 11:29 ]


  • gvdh81
  • Registratie: Juli 2001
  • Laatst online: 28-04 19:57

gvdh81

To got or not to got..

In plaats van dit dan te verwerken zou ik een melding geven "Foutieven invoer", uitleggen hoe het wel moet en de string (zonder de lege elementen) standaard invullen zodat ze deze nogmaals kunnen submitten.

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 23-04 13:07
edit:
nevermind

[ Voor 83% gewijzigd door stekkel op 22-09-2005 11:28 ]


Verwijderd

Topicstarter
JaWi schreef op donderdag 22 september 2005 @ 11:08:
Gebruik de volgende regexp:
PHP:
1
preg_match( '([a-zA-Z0-9]+)(?:,)?', $_POST['trefwoorden'] )

Je wilt namelijk dat je trefwoorden uit letters en/of cijfers bevatten, en dat er eventueel een komma achter een "woord" staat. Maar de komma is optioneel (anders kun je geen losse woorden invoeren).
preg_match( '([a-zA-Z0-9]+)(?:,)?',$_POST['trefwoorden'] )
Warning: preg_match() [function.preg-match]: Unknown modifier '(' in ...

Bekend probleem, bij mij deed hij dat ook, als ik buiten de class []() gebruikte, maar waarom het niet werkt weet ik helaas niet :(
Nee je hebt eigenlijk wel gelijk, maar dit was eigenlijk even een test versie, uiteraard zet ik er straks ook nog mysql_real_escape_character() tussen, althans dat lijkt me goed.

[ Voor 23% gewijzigd door Verwijderd op 22-09-2005 11:34 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 16:04

crisp

Devver

Pixelated

Verwijderd schreef op donderdag 22 september 2005 @ 11:32:
[...]
Bekend probleem, bij mij deed hij dat ook, als ik buiten de class []() gebruikte, maar waarom het niet werkt weet ik helaas niet :(
Je moet ook delimiters gebruiken ;)

Intentionally left blank


Verwijderd

Topicstarter
crisp schreef op donderdag 22 september 2005 @ 11:12:
[...]

Dat ligt er aan wat je er daarna mee doet; als je een preg_split gebruikt met PREG_SPLIT_NO_EMPTY maakt dat natuurlijk niets uit...
Anders zou je nog zoiets kunnen doen:

/^([a-zA-Z0-9]+,?)+$/
Jouw versie werkt :D
Alleen vraag ik me af of het vraagteken ? op het einde wel de bedoeling is, want dat wilt nu volgens mij zeggen dat de komma maar 0 of 1 keer mag voorkomen klopt dat? dus in dat geval zou ik volgens mij het sterretje * moeten gebruiken? Ga ik nu even testen :)

edit:

Oke vaag je versie werkt toch wel :/

[ Voor 5% gewijzigd door Verwijderd op 22-09-2005 11:39 ]


  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

Verwijderd schreef op donderdag 22 september 2005 @ 11:37:
[...]


Jouw versie werkt :D
Alleen vraag ik me af of het vraagteken ? op het einde wel de bedoeling is, want dat wilt nu volgens mij zeggen dat de komma maar 0 of 1 keer mag voorkomen klopt dat? dus in dat geval zou ik volgens mij het sterretje * moeten gebruiken? Ga ik nu even testen :)
Heb je nu ook een idee waarom het werkt? ;)

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


Verwijderd

Topicstarter
Haha, voor de helft, oke ik zal het "proberen" te verklaren:

regex: /^([a-zA-Z0-9]+,?)+$/

"/^" Geeft aan dat hij begint met ... waarde forward slash voor is, geen idee? misschien bepalen dat daar de regexp begint?

"([a-zA-Z0-9]+,?)" Matcht op alles tussen kleine letters a tot en met z en grote letters A tot en met Z en 0 tot en met 9. met de + kun je een expressie plakken aan eensubexpressie? en daarin geef ik aan dat de komma 0 of 1 keer mag voorkomen (waarom meerdere komma's nu dus toch werkt is voor mij een raadsel)

"+$/" Dit is het einde van regexp ?

Wat is mijn cijfer voor mijn proefwerk ? O-) :D

edit:

Na de reactie van crisp vindt ik wel dat ik een 8,5 verdient heb :P

[ Voor 24% gewijzigd door Verwijderd op 22-09-2005 12:09 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 16:04

crisp

Devver

Pixelated

/    delimiter; geeft start van reguliere expressie aan
^    begin met matchen vanaf begin van de string
([a-zA-Z0-9]+,?)    1 of meer letters/cijfers, eventueel gevolgd door een komma
+    en dat 1 of meer keer
$    tot het einde van de string
/    delimiter, geeft einde van reguliere expressie aan

Intentionally left blank


  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

offtopic:
Eigenlijk te zot voor woorden dat PHP nog steeds die Perl-achtige regex-delimiters gebruikt. Da's nl. dubbelop met de quotes rondom de regex en hebben dus absoluut geen functie...

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

JaWi schreef op donderdag 22 september 2005 @ 12:46:
offtopic:
Eigenlijk te zot voor woorden dat PHP nog steeds die Perl-achtige regex-delimiters gebruikt. Da's nl. dubbelop met de quotes rondom de regex en hebben dus absoluut geen functie...
ehm, wat dacht je van eventuele modifiers?
en je kan altijd nog POSIX regexjes gebruiken als je dat wilt, dan heb je die delimiters niet nodig.

Maar waarom is het raar, die regex is in PHP gewoon een string, en een string moeten quotes omheen, of wilde je _nog_ een datatype introduceren alleen hiervoor? (het enige nadeel kan het escapen van quotes zelf zijn, maar zo boeiend is dat ook niet))

  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

Erkens schreef op donderdag 22 september 2005 @ 12:52:
[...]
ehm, wat dacht je van eventuele modifiers?
en je kan altijd nog POSIX regexjes gebruiken als je dat wilt, dan heb je die delimiters niet nodig.
Modifiers kun je ook middels een non-captive group [(?imsx-imsx)] oplossen, zoals Perl en Java dat ook ondersteunen. Sowieso kun je daarnaast nog POSIX regex's gebruiken natuurlijk.
Maar waarom is het raar, die regex is in PHP gewoon een string, en een string moeten quotes omheen, of wilde je _nog_ een datatype introduceren alleen hiervoor? (het enige nadeel kan het escapen van quotes zelf zijn, maar zo boeiend is dat ook niet))
Je geeft je eigen antwoord al: die quotes zijn al expliciete delimiters (net zoals dit bij Java ook het geval is), daar heb je niet nog eens extra slashes of pipe-characters voor nodig.
Ik weet wel waarom ze er nog inzitten, omdat PHP ooit eens ontsponnen is uit Perl, en op deze manier vervolgens makkelijk regex's van PHP richting de Perl(-interpreter?) geduwd konden worden, maar PHP is toch inmiddels al een hele tijd een "zelfstandige" taal, dus je verwacht dat dit soort cruxen in de loop der tijden opgelost, danwel eruit gehaald zouden worden...

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Wat maken die 2 extra bytes eigenlijk uit :?
Maar ehm de regexjes worden niet naar de per interpreter gestuurd hoor, er zijn behoorlijk wat verschillen ;)
Pagina: 1