ugrás a tartalomhoz

Reguláris kifejezések

Castor87 · 2007. Okt. 29. (H), 20.43
Üdv!
Van egy string változóm amibe több soros szöveg van.
Egy olyan részt akarok kinyerni belőle, ami az alábbi feltételeknek felel meg:

(xy) ??? (zv)

Már mindenhogy próbáltam, de nem sikerült. A ??? helyén nem tudom milyen szöveg van, de azt tudom hogy mi van közvetlen előtte és utána. Na most azt a részt szeretném kinyerni a szövegből, ami a két ismert rész között van (az ismeretlent).

Köszönöm előre is a válaszokat!
 
1

preg_match

Castor87 · 2007. Okt. 29. (H), 21.16
Eddig a preg_match függvénnyel próbálkoztam, így ha valaki többféleképpen is meg tudja oldani, akkor inkább ezzel a függvénnyel ha lehet.
2

talán így

Castor87 · 2007. Okt. 29. (H), 21.46
preg_match('(xy.*zv)', $hol, $hova);
3

esetleg így?

numen · 2007. Okt. 29. (H), 22.13
'xy(.*)zv'

csak a köztes rész kell, ha minden igaz
4

Ha van zárójel, akkor nem jó

Franczen Attila · 2007. Okt. 29. (H), 22.51
preg_match("/xy(.*)zv/",$szoveg,$matches);
print_r($matches); eredménye:

Array ( [0] => xy) ??? (zv [1] => ) ??? ( )

Tehát ott van még a zárójel is.


Az én megoldásom:

preg_match("/(\(xy\)\s)(.*)(\s\(zv\))/",$szoveg,$matches);

print_r($matches);

Eredmény:
Array ( [0] => (xy) ??? (zv) [1] => (xy) [2] => ??? [3] => (zv) )

Tehát $matches[2] az ami neked kell. Nem biztos, hogy ez a jó, mert kezdő vagyok regexp-ben, de próba cseresznye :))
5

preg_match

Castor87 · 2007. Okt. 29. (H), 22.53
A preg_match működik több sor esetén is, nem? Mert amit találtam megoldást, tökéletesen működik egy sorra. De többre nem. :( Tehát azt jelzi nincs találat, ha az eredmény több sor lenne...
7

flag-ekkel állítható

Franczen Attila · 2007. Okt. 29. (H), 23.28
Úgy tudom alapból nem.
Az 'm' flag-el kapcsolod ezt be.

preg_match('/xy(.*)zv/m',$szoveg,$talalat);

Kíváncsivá tettél. Mihez kell neked, ha nem titok :)

Írj egy konkrét példát lécci, hátha van még, amit nemvettünk figyelembe.
8

köszi szépen hogy ilyen segítőkész vagy :)

Castor87 · 2007. Okt. 29. (H), 23.50
Ezt a /m flaget nem sikerül használnom.
Ez az egész arra kell hogy több szövegből kinyerjek bizonyos adatokat. Egy szövegkörnyezetbe vannak személyes adatok név, cím, telszám, stb. Na most a ??? azért ismeretlen, mert ciklusba néz meg több szöveget.
Ja és egy ciklus lefutásban több ilyen vizsgálat is van. Ha egy sorban vizsgálódok akkor ez jól működik:
preg_match('(xy.*zv)', $hol, $hova);
De ebben az esetben nincs találat:

kj sdkgjhdj XY kfhkdjfh
dfg sdfg sdf gdf gsdf dg
dfsgsdfg dsf gsdg ZV fdgsdf

Tehát itt több sort kéne kinyerni belőle. Na most a /m-et hogy használhatom?
10

Case insensitive

kismiska · 2007. Okt. 30. (K), 05.45
A példádban nagybetüvel szerepel a nyitó/záró karaktersorozat, a regexp-ben kicsivel. Erre megoldás a /i módosító.
preg_match('/xy(.*)zv/i', $hol, $hova);

Ha engem csak a köztes tartalom érdekelne, inkább így próbálnám:
preg_match('/(?<=xy).+(?=zv)/si', $hol, $hova);
9

s flag

Castor87 · 2007. Okt. 30. (K), 00.31
úgy néz ki nem /m hanem /s a keresett flag
6

hiba

Castor87 · 2007. Okt. 29. (H), 22.54
A te megoldásodnál valamiért hibát ír nekem, mivel xy és zv nincsenek zárójelbe.
11

delimiter lemaradt...

numen · 2007. Okt. 30. (K), 14.24
"'xy(.*)zv'FLAGEK" - ez már szerintem működhet...
szerintem az lehetett a hiba oka, hoyg nem raktam határolókat... illetve az aposztrófot használtam... így már feltehetőleg jobb
picinyt megzavart a külső zárójel, belátom, nem tudtam, hogy az is lehet delimiter...