Autor Zpráva
nemeja
Profil
Zdravím,
snažím se vytvořit si svuj šablonovací systém, nicméně ted jsem narazil na problém s regulárním výrazem na masku, která představuje podmínku
?[hodnota1]==[hodnota2]_OR_[hodnota3]!=[hodnota4]_AND_...
vyzkoušel jsem už zpoustu možností jak napsat ten regex, ale nikdy nefungoval :(
zde dávám náhled mého posledního snažní
/\?([a-zA-ZO-9_\-])([=!<>]{1,3})(.*)(([a-zA-ZO-9_\-])([=!<>]{1,3})(.*)([AND|OR|&&|\|\|])+)/

potřebuju aby to začínalo otazníkem a vždycky první část podmínky byla [a-zA-Z0-9_] pak možnost operátorů což jsem napsal jako [=!<>]{1,3}, druhá část podmínky cokoliv (.*), další část už nemusí být vždy _OR|AND|&&|\|\|_ a zase znova

Děkuji za radu
Tori
Profil
Za podmínkou asi následuje část, která se má/nemá zobrazit + sekvence pro konec podmíněné části, ne? Asi bych nejdřív jedním regulárem našla jen celý blok (tedy rozlišit jen hlavní části:
[otazník = začátek bloku] [podmínka: jakékoli znaky] [konec podmínky] [jakékoli znaky] [konec bloku]
), a pak druhým regulárem zpracovala jen tu část s podmínkou, např.:
$re = '~(?:(?:\s*_(?<condJoin>OR|AND|&&|\\|\\|)_\s*)?\\[(?<leftSide>[a-zA-Z0-9_-]+?)\\]\s*(?<comparison>[=!<>]{1,3})\s*\\[(?<rightSide>[a-zA-Z0-9_-]+?)\\])~s';
preg_match_all($re, $blok['podminka'], $podminky, PREG_SET_ORDER)
(přidala jsem tam možnost bílých znaků okolo operátorů, aby se to dalo v šabloně přehledně zalamovat.
nemeja
Profil
děkuji, bílé znaky jsem striktně zakázal a měním je za "_"
nemeja
Profil
Tori:
nefunguje :(, zkoušel jsem tenhle vstup a neprojde to
$vstup = "?ja==ty_AND_on==ona_OR_my<vy_&&_nic>nic_||_moc!=prílis";
Tori
Profil
nemeja:
Podle [#1] jsem myslela, že hodnoty mají být v hranatých závorkách, tak je vyhoďte z reguláru. I tak vám to nezachytí poslední podmínku kvůli diakritice ("prílis").
nemeja
Profil
Děkuju, už to funguje :)


Změna :D vrací to nesmyslný hodnoty
$vstup = "?ja==ty_AND_on==ona";
$reg = '~(?:(?:_(?<condJoin>OR|AND|&&|\\|\\|)_)?(?<leftSide>[a-zA-Z0-9_-]+?)(?<comparison>[=!<>]{1,3})(?<rightSide>[a-zA-Z0-9_-]+?))~s';

array
  0 => 
    array
      0 => string 'ja==t' (length=5)
      1 => string 'y_AND_on==o' (length=11)
  'condJoin' => 
    array
      0 => string '' (length=0)
      1 => string '' (length=0)
  1 => 
    array
      0 => string '' (length=0)
      1 => string '' (length=0)
  'leftSide' => 
    array
      0 => string 'ja' (length=2)
      1 => string 'y_AND_on' (length=8)
  2 => 
    array
      0 => string 'ja' (length=2)
      1 => string 'y_AND_on' (length=8)
  'comparison' => 
    array
      0 => string '==' (length=2)
      1 => string '==' (length=2)
  3 => 
    array
      0 => string '==' (length=2)
      1 => string '==' (length=2)
  'rightSide' => 
    array
      0 => string 't' (length=1)
      1 => string 'o' (length=1)
  4 => 
    array
      0 => string 't' (length=1)
      1 => string 'o' (length=1)



Takže konečně jsem přišel ke konečnému řešení

$reg = "~(_(AND|OR|&&|\|\|)_*)([a-zA-Z0-9-]+)([=!<>]{1,3})([a-zA-Z0-9-]+)~";

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: