Egy SQL lekérdezésben az adatok között vannak olyanok, amik után van egy zárójelek közti karaktersor, míg másokban nincs. Hogyan lehetne erre PHP-ban regex-et illeszteni?
A probléma leegyszerűsítéseként ezzel próbálkoztam: '.*".$var.".*'
, aztán rájöttem, hogy a zárójel nem "bármely" karakter... Összességében számtalan opcionális zárójel illesztés kipróbálása után egyik sem tudta kivenni a kívánt rekordot.
- 4183 megtekintés
Hozzászólások
Nem tudom, hogy jól értem-e a kérdésed, de szerintem valami ilyesmiről lehet szó:
// Places three space separated words into $regs[1], $regs[2] and $regs[3].
ereg("([[:alnum:]]+) ([[:alnum:]]+) ([[:alnum:]]+)", $string, $regs);
- A hozzászóláshoz be kell jelentkezni
pl.: XXX XXX (YYY)
- A hozzászóláshoz be kell jelentkezni
Ebből mit akarsz kivenni?
Külön az XXX XXXet, és az YYYt, vagy egyben az egészet, csak az a cél, hogy matcheljen az
XXX XXX (YYY)
és az
XXX XXX
formára is?
Ill ha ki kell venni darabokat, akkor mi van a spacekkel (soreleje, zárójelek két oldalán)?
--
de egyébként kb: http://regexr.com/396ir
- A hozzászóláshoz be kell jelentkezni
Mindkét esetben egyben kéne kivenni a karaktersorokat, szóközökkel együtt.
Azt tapasztaltam, hogy a PHP nem minden "szabványos" regexet ismer fel. Erről lehet tudni bővebbet?
- A hozzászóláshoz be kell jelentkezni
Most akkor jól értem, hogy mindent ki kellene szedni?
Áruld már el légyszi, hogy _pontosan_ mi is a feladat :)
- A hozzászóláshoz be kell jelentkezni
nem lenne baj :)
Mert ha mindkét esetben minden kell, akkor első bliccre a teljes string kell, és jóidő :)
- A hozzászóláshoz be kell jelentkezni
Mindkét esetben a teljes string kell, viszont a zárójelet nem tekinti "tetszőleges karakternek", nem tudja ráilleszteni.
- A hozzászóláshoz be kell jelentkezni
Ezzel azt akarod mondani, hogy a ( ) karakterekre nem illeszkedik a . a reguláris kifejezésre? Mert ez nem igaz.
- A hozzászóláshoz be kell jelentkezni
Igen, így van, minden más esetben működött a .* megoldás, a zárójeleseknél viszont nem.
- A hozzászóláshoz be kell jelentkezni
Nyilván lehet, gondolom van dokumentálva. Mivel kerülöm a phpt, ezért csak google foo, de van egy prcenek nevezett izé, ami kifejtve perl compatible regular experssions. Itt az első link alatt van a konrkét mit hogyan kell reference doksi, a harmadik alatt a különbségek a perltől (amire ránézve semmi komoly veszteség), a negyedik meg kifejti, hogy a régi posixes regex enginetől miben különbözik.
Abból, hogy te lent olyan mintát adtál meg, amiben nincsenek delimeterek, ezen link alapján valószínűleg te a régi, itt deprecatednek mondott php regex implementációt használod (Merthogy az első pont arra hívja fel a figyelmet, hogy kellenek), és mivel a doksi máshol az 5.005ös perlre hivatkozik, ami üszkve 15 éve volt, lehet érdemes lenne megnézned a másikat :)
De mondom, passz, nem beszélek phpül.
- A hozzászóláshoz be kell jelentkezni
Hacsak félre nem értettem az egészet, itt nem a php RE-kezelése focizik: a kolléga mysql-ből kérdezne le RE alapján - és a többször idézett hibaüzenet is a mysql-é.
Ezért firtatnám, hogy hogyan is néz ki a bukó sor szélesebb környezete, meg azért, mert a ugyan a mysql dok szerint ERE az, amit használ, de én mégis csak megnézném, hogy mit lépne az a példány + és ? mennyiségjelzők nélkül, és a BRE zárójelkezelésével. Ilyen teszt egyébként könnyen végezhető az ebben foglalt példák szerint: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
szerk.: úgy látszik, csak én értettem így, hogy mit akar a költő.
- A hozzászóláshoz be kell jelentkezni
Attól még simán lehet igazad :-) Az eddig infókból tulajdonképp kis túlzással ikeás hintaszéket is össze lehet rakni. Mint mondtam, nem nagyon beszélni php (10 éve nem nyúltam hozzá csak bottal, és akkor se sokat), uh én elhittem a regexet, aztán gugliztam, de el tudom képzelni, hogy tulajdonképpen valami mysql selectet szeretne összerakni.
- A hozzászóláshoz be kell jelentkezni
Valóban ez lett volna a célom és valóban hibáztam, hogy a php-t és a mysql-t ilyen téren egy kalap alá próbáltam vonni. Végülis nagyon egyszerű megoldása lett a problémának, egy "like" és két "%" felhasználásával. Igazatok van, tényleg túl lett bonyolítva a dolog a részletek nem ismerése miatt.
- A hozzászóláshoz be kell jelentkezni
Ahogy sejtettem, erre sem illeszti rá a PHP a zárójeleset.
- A hozzászóláshoz be kell jelentkezni
komolyan segítene, ha legalább az egész sort elárulnád. Legalább a fügvény nevét.
Egyébként meg továbbra is kérdés, hogyha úgyis az egész kell, akkor mi a francnak regex?
- A hozzászóláshoz be kell jelentkezni
Hja hát úgy tűnik van akin nem lehet segíteni! Mert a) képtelen elnyökögni értelmesen, h mi a problémája; b) szólnak neki, hogy akkor másolja már ide a kibaszott kódját, h abból majd hátha kiderül mit akar - de ezt meg sem hallja; c) adnak neki egy működő mintát, akkor meg jön azzal, hogy húúúáááá a PHP nem illeszt - hát persze...mert ő már eddig is sejtette..
$str = "XXX XXX (YYY)
XXX XXX";
$regexp = "/\s*([^\(]+)\s*(\((.+)\)\s*)?/";
preg_match($regexp, $str, $match);
print_r($match);
//Array ( [0] => XXX XXX (YYY) [1] => XXX XXX [2] => (YYY) [3] => YYY )
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Ha a zárójelet literális karakterként akarod megadni, akkor kell eléje egy \ jel.
- A hozzászóláshoz be kell jelentkezni
Igen, az megvolt, viszont az opcionális mivoltát nem sikerült szerintem korrekten megadni.
- A hozzászóláshoz be kell jelentkezni
A * karakter 0 vagy többszöri előfordulást,
a + karakter 1 vagy többszöri előfordulást jelez.
Szerintem Neked a * kell a zárójel után.
- A hozzászóláshoz be kell jelentkezni
inkabb a kerdojel.
t
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Így?
'.*\(?.*\)?'
Failure in select: Got error 'repetition-operator operand invalid' from regexp
- A hozzászóláshoz be kell jelentkezni
Most vettem észre, hogy írtál mintát is.
Én valami ilyesmire gondolok:
Ha mindkét változatra illeszkednie kell, akkor valami hasonlót tudok elképzelni. (Nem tudtam kipróbálni.)
" .+ .+( \(*.+\)*)?"
Itt a kérdőjel jelzi az opcionális részt a zárójelek között. (Ahogy látom, már elöttem is írták.)
- A hozzászóláshoz be kell jelentkezni
Ez ugyanúgy: "Failure in select: Got error 'repetition-operator operand invalid' from regexp"
- A hozzászóláshoz be kell jelentkezni
Lehetne látni az egész parancssort és a környezetét?
Ui. az itt posztolt regexpek a feladatra (vagy másra) jók, viszont itt a mysql panaszkodik, hogy nem tudja úgy értelmezni, ahogyan ő látja.
A hívás kontextjével lesz a gond (konkrétan valamilyen idézőjelezési mizériát sejtek).
- A hozzászóláshoz be kell jelentkezni
Teljes egészében így nézne ki a kifejezés: '.+ .+( \(*.+\)*)?".$var.".+ .+( \(*.+\)*)?'
- A hozzászóláshoz be kell jelentkezni
Ha titkos a kód, nem firtatom tovább, de engem a kifejezésed környezete IS érdekelne.
- A hozzászóláshoz be kell jelentkezni