Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

regexp i preg_match_all

17 views
Skip to first unread message

Jivanmukta

unread,
Feb 22, 2019, 2:02:14 PM2/22/19
to
Mam błąd w wyrażeniu regularnym ale nie wiem co jest źle. Potrzebuję dla
tekstu (kodu w PHP):

private $data, $invalid;

wydobyć identyfikatory tzn. napisy data i invalid.
Robię to tak:

preg_match_all("/(static)?\\s*(private|protected|public)\\s+(static)?\\s*(\\\$([A-Za-z0-9_]+),?\\s*)+\\s*[^\\(]/",
'private $data, $invalid;', $matches, PREG_OFFSET_CAPTURE);
var_dump($matches[5]);

array(1) {
[0] =>
array(2) {
[0] =>
string(7) "invalid"
[1] =>
int(16)
}
}

Nie rozumiem dlaczego w wynikach nie mam napisu data.

Borys Pogoreło

unread,
Feb 25, 2019, 7:24:22 AM2/25/19
to
Dnia Fri, 22 Feb 2019 20:02:12 +0100, Jivanmukta napisał(a):

> Nie rozumiem dlaczego w wynikach nie mam napisu data.

Trafiłeś na ograniczenie wyrażeń regularnych dla powtarzalnych wzorów
będących częścią zapytania - większość implementacji zwraca tylko ostatnie
dopasowanie w tym przypadku.

Musisz to rozwiązać inaczej - np. najpierw sprawdzając dopasowaniem czy
masz do czynienia z prawidłową wartością, a później wyciągając nazwy
zmiennych prostym wyrażeniem typu /\$([A-Za-z0-9_]+)(?:,\s*)?/ (pamiętaj
tylko, że nie uwzględnia ono definicji zmiennej z przypisaną wartością).

--
Borys Pogoreło
borys(#)leszno,edu,pl

Jivanmukta

unread,
Feb 26, 2019, 1:42:24 PM2/26/19
to
Dzięki Borys, zrobiłem jak doradziłeś. Problem zamknięty.

Jivanmukta

unread,
Sep 10, 2019, 2:24:17 PM9/10/19
to
Mam jeszcze jedno pytanie:

Potrzebuję dla stringu " REGION_ID . ' ' . // mazowieckie"
wydobyć stałą REGION_ID. Użyłem wyrażenia regularnego:
[^\$]([A-Z_][A-Z0-9_]*) ale jest źle bo dostaję "EGION_ID". Jakim
wyrażeniem wydobywać stałe?

Jivanmukta

unread,
Sep 11, 2019, 5:21:53 AM9/11/19
to
W dniu 10.09.2019 o 20:24, Jivanmukta pisze:
Właściwie to powininem uwzględnić że nie może być nawias za stałą oraz
małe litery.
[^\$]([A-Za-z_][A-Za-z0-9_]*)\s*[^\(]

Jivanmukta

unread,
Sep 15, 2019, 1:01:31 PM9/15/19
to
Potrzebuję jeszcze napisać wyrażenie regularne do wydobywania wywołań
funkcji ale tak, żeby nie pasowała deklaracja funkcji. Napisałem:

[^a-z]\s*([a-z0-9_]+)\s*\(

ale mi dopasowuje do:

function invoice(

a chciałbym tylko do:

invoice(

Jak to napisać?
0 new messages