Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Regex] statement matchen

Pagina: 1
Acties:

  • ZeroXT
  • Registratie: December 2007
  • Laatst online: 13:12
Ik probeer een statement te matchen om deze later te parsen:

PHP:
1
2
3
$line = "if(count($array) > 0)";

preg_match_all(/if\((.*?)\)/is, $line, $match);


De match zou met de bovenste regex het verkeerde opleveren:
count($array)

de > 0 wordt door de functie count() genegeerd vanwege de sluitende ). Nu weet ik dat als ik tot aan het einde wil matchen, ik een $ teken moet gebruiken:
PHP:
1
preg_match_all(/if\((.*?)\)$/is, $line, $match);


Alleen soms krijg ik een string binnen waarbij er meerdere statements achter elkaar staan.

Iemand enig idee hoe ik dit kan oplossen? :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Zonder regular expressions. ;)

'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.


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Met een extra groep en http://www.php.net/manual/en/regexp.reference.recursive.php zou het kunnen:
code:
1
/if(\((((?>[^()]+)|(?1))*)\))/is
;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Cor453
  • Registratie: Mei 2011
  • Laatst online: 30-10 14:42
Wat ga je met deze constructie doen? Je zegt "om deze later te parsen", bedoel je dan als in een eval() constructie? Want dan moet je best wel goed oppassen zeg maar.

Waar wil je heen en wat is je use-case? Misschien fijn om erbij te zetten ;)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

pedorus schreef op maandag 31 maart 2014 @ 00:36:
Met een extra groep en http://www.php.net/manual/en/regexp.reference.recursive.php zou het kunnen:
code:
1
/if(\((((?>[^()]+)|(?1))*)\))/is
;)
PHP:
1
if ($character == '(')


Je moet dit soort dingen gewoon niet met een regexp willen doen. Zolang je niet context-aware bent is het verdomd lastig om te zien wat er nu wel en niet in het if-statement hoort. Even los van de terechte vraag van Cor453 waarom iemand dit zou willen doen is de oplossing die het meest tegen een stootje gaat kunnen een simpele parser, al dan niet stack-based.

'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.


Verwijderd

Kijk dan alsjeblieft naar een parser generator. Je moet dit soort dingen niet zelf willen schrijven.

  • pedorus
  • Registratie: Januari 2008
  • Niet online
NMe schreef op maandag 31 maart 2014 @ 00:43:
Je moet dit soort dingen gewoon niet met een regexp willen doen.
Het was geen serieus voorstel natuurlijk.

Php heeft trouwens een functie http://www.php.net/manual/en/function.token-get-all.php

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1