[php] wyrażenie regularne i kłopoty z nim związane

0

witam,

potrzebuję napisać wyrażenie regularne, które korzysta z mniej więcej takiego wzorca (moimi słowami)

dowolny_znak + SŁOWO + dowolny_znak + ( + dowolny_znak(co najmniej jeden) + ) + dowolny_znak + ; + dowolny_znak

zamiast dowolny_znak może być znak alfanumeryczny lub białe znaki (zero, jeden lub więcej).
Mam problem z konstruowaniem takiego wyrażenia. Napisałem na razie tyle:
*system\\(.+.\\)*

i to dla linijek typu
system("");
działa, ale po 1 nie bierze pod uwagę średnika
2 nie bierze pod uwagę tych dowolny_znak

no i nie wiem jak to ugryźć dalej...

0

nie działa, bo gwiazdek tak się nie używa. gwiazdka to powtórzenie zero lub więcej razy wzorca poprzedzającego gwiazdkę.

jeśli dowolny znak to dowolny JEDEN znak (tak sugeruje użycie liczby pojedynczej), to .system.(.+).;. ale to nie ma prawa znaleźć tego, co podałeś jako przykład.

.system.(.{2,}).;.

zamiast kropek możesz wstawić [\w\s], żeby otrzymać tylko białe i/lub alfanumeryczne znaki, ale to też będzie bez sensu, bo znajdzie - oprócz system - omgomgsystem i omg omg system. popraw opis.
wróżka twierdzi, że chodzi Ci o [\w]system[\w]([\w][^\w]{2,}[\w])[\w];[\w]

0

to może podam kilka przykładów, dla rozjaśnienia sytuacji.

Te wiersze powinny zostać się zgadzać z wyrażeniem regularnym

system("");
    system("");
system(a);
fsdk system ( slowo)  ; kdkddk

natomiast te już nie:

asystem("");
system();
0

dowolny_znak + SŁOWO + dowolny_znak + ( + dowolny_znak ..........

zamiast dowolny_znak może być znak alfanumeryczny .......

czyli np:
lalaSŁOWOlala(LALA

:P

nie umiesz tłumaczyć


edit: sorry, nie zauważyłem, że ŁF już się do tego przyczepił..

0

lalaSŁOWOlala(LALA

nie może być :)
ale może być

lala SŁOWO (LALA)

na początku może być (przed SŁÓWO)
znaki alfanumeryczne + biały znak(i)
albo same białe znaki

po SŁOWO, ale przed nawiasem mogą być tylko białe znaki
pomiędzy nawiasami musi być co najmniej jeden znak (ale nie biały) np "fsfs" albo fjslfslk
pomiędzy zamykającym nawiasem a średnikiem mogą być tylko białe znaki
natomiast po średniku dowolnie

0
(^.*?\w|^|;.*?\w|;)system\w*\(\w*\W{2,}\w*\)\w*;\w*

\w - łajtspejs, \W - niełajtspejs, - początek linii, ? - dopasowanie najkrótszego pasującego do wzorca ciągu, | - alternatywa, {m,} - co najmniej tyle powtórzeń wzorca, [] - dopasowanie wszystkiego poza podaną grupą znaków, * - zero lub więcej powtórzeń wzorca (inaczej {0,}), () - grupa lub priorytet dla warunku logicznego

ale nie jestem pewien co do możliwości budowania alternatywy dla początku linii, a w domu nie mam narzędzia do sprawdzenia tego regexpa.
a jeszcze co do Twojego tłumaczenia z pierwszego posta: znak i słowo to nie to samo.

jeśli wzorzec, który Ci podałem nie działa, to masz opisane co do czego służy, przeanalizuj tego regexpa i popraw go. jak byś chciał jeszcze wyciągnąć nazwę polecenia i jego parametr, to użyj zamiast system - (\W+) i zamiast \W{2,} - (\W{2,}), wtedy polecenie będzie w pierwszej grupie, a argument w drugiej (licząc od zera).

0

ok, myślę, że teraz sobie poradzę, tylko mam jeszcze jeden problem. Dostaję ostrzeżenie od PHP w linii gdzie kompiluję (?) zapytanie

Warning: preg_match(): Unknown modifier 'y'

gdy usunę z system 'y', to błąd wskazuje na literę 't'. Czym to jest spowodowane?

0

pomyliłem \w z \s i \W i \S, ale to nie powód tego błędu

0

dla jednego polecenia w linii:

(^|^.*?\s)\s*system\s*\(\s*\w{2,}\s*\)\s*;

dla większej ilości pewnie trzeba użyć positive look behind w poszukiwaniu poprzedzającego średnika, ale nie chce mi się już kombinować, tym bardziej że look ahead i behind mają mnóstwo ograniczeń

0

dane mam umieszczone, więc będę wstawiać tam linia po linii

wyrażenie nie wywala się, gdy zacznę i zakończę je znakiem "/", czyli
/(^|^.*?\s)\s*system\s*\(\s*\w{2,}\s*\)\s*;.*/

jednak nadal nie znajduje mi tego, co chciałem, ale już sam coś pokombinuję. Jak mi się nie uda, to zwrócę się do was o pomoc

0

rusz sam głową. przecież to oczywiste, że w php regexpy buduje się zaczynając i kończąc specjalnym znakiem (/#$% itp). ja akurat nie używam php, poza tym znak rozpoczynający i kończący regexp nie wchodzi w skład samego wyrażenia.
masz edytor, masz przeglądarkę, masz serwer www s obsługą php, masz google, sam możesz poprawić niedomagające wyrażenie.

ale skoro już je napisałem: (|.?\s)\ssystem\s*(\s*[\/.\w\d'"]{2,}\s*)\s*;
testowane na eclipse na czymś takim:

system(dupa 	) ; system(dupa 	) ; system(dupa 	) ; ;;;
 system( "dupa");      
 system( 1.2);      
1 system( dupa    )		;    
1234 ; system(dupa)				;

a teraz nie pisz, że jeszcze coś nie działa, tylko sam to popraw.

0

trochę więcej cierpliwości :)
napisałem, że sam pokombinuję i tak zrobiłem
/(.*;\s*)*system\s*\(\s*.{1,}\s*\)\s*;.*/

1 użytkowników online, w tym zalogowanych: 0, gości: 1