php - preg_match nie wykrywa apostrofu

Potrzebujesz pomocy z C, C++, perl, python, itp.
sigo
Junior Member
Posty: 501
Rejestracja: 21 marca 2009, 19:12

php - preg_match nie wykrywa apostrofu

Post autor: sigo »

Próbuję utworzyć wyrażenie regularne dla funkcji preg_match w php, by przefiltrować dane. ¦ciślej mówiąc, chcę pozwolić jedynie na użycie określonej grupy znaków.

Problem pojawił się, gdy chcę wykryć, czy użyto apostrofu.

Używam kodu

Kod: Zaznacz cały

if(preg_match("/^[']/+$", ...
Gdy wyrażenie zostanie zmodyfikowane do postaci

Kod: Zaznacz cały

if(preg_match("/[']/", ...
apostrof jest wykrywany, ale powyższy warunek pozwala na użycie wszystkich znaków - a nie na tym mi zależy.

Czy ktoś jest w stanie mi poradzić, co powinienem zmodyfikować, by uzyskać pożądany efekt?
Z góry dziękuję za odpowiedzi.
Awatar użytkownika
lis6502
Member
Posty: 1798
Rejestracja: 05 listopada 2008, 20:14
Lokalizacja: Miasto Szybowców

Post autor: lis6502 »

Spróbuj zaescapować apostrof backslashem do postaci:
\'
Co prawda nie jest on słowem kluczowym wyrażeń regularnych, ale może być dla samego PHP.
sigo
Junior Member
Posty: 501
Rejestracja: 21 marca 2009, 19:12

Post autor: sigo »

Znak karetki niestety też nie pomaga.
Awatar użytkownika
lis6502
Member
Posty: 1798
Rejestracja: 05 listopada 2008, 20:14
Lokalizacja: Miasto Szybowców

Post autor: lis6502 »

Przejrzałeś pomoc? Miałem na myśli przekształcenie wyrażenia do postaci
if(preg_match("/^\[\'\]\/\+\$"
Rozumiem że to właśnie tych znaków chcesz się pozbyć. Napisz najlepiej swoje kryteria filtrowania i coś się pomyśli.
Stawi
Beginner
Posty: 209
Rejestracja: 10 lutego 2007, 16:02
Lokalizacja: Kraków

Post autor: Stawi »

sigo pisze:Problem pojawił się, gdy chcę wykryć, czy użyto apostrofu
A nie lepiej zrobic strpos() ? Po co uzywac Wielkiego prega do szukania znaku...
A tobie chodzi chyba o cos takiego:

Kod: Zaznacz cały

if(preg_match("/^[ZNAKI]+/$", ...
gdzie ZNAKI to wypisane znaki na jakie chcesz pozwolic. Eskejpowac trzeba duzo roznych, ale nie apostrof. Latwo mozna sprawdzic co:

Kod: Zaznacz cały

$znaki = preg_quote("1234567890abcdef")]+$/", ..);
Osobiscie uwazam ze lepiej sprawdzic czy jakis niedozwolony znak nie wystapil. czyli zamiast /^[abc]+$/ wpisac /[^abc]/ i wynik potem zanegowac - dziala wydajniej ;)
sigo
Junior Member
Posty: 501
Rejestracja: 21 marca 2009, 19:12

Post autor: sigo »

Z manualem na stronie php zapznałem się; nic nie znalazłem.

Chcę użyć prega, gdyż liczba dozwolonych znaków jest dosyć spora.

Kod: Zaznacz cały

a-z
ą-ź
0-9
spacja
. , ? ! & - ( ) ' "
Poradziłem sobie z większością - pozostał jedynie apostrof i cudzysłów.
Awatar użytkownika
lis6502
Member
Posty: 1798
Rejestracja: 05 listopada 2008, 20:14
Lokalizacja: Miasto Szybowców

Post autor: lis6502 »

Spróbuj wpisać je tak
\x22 cudzysłów
\x27 apostrof
sigo
Junior Member
Posty: 501
Rejestracja: 21 marca 2009, 19:12

Post autor: sigo »

Bez efektu...
Eh, przeszkadza ten początkowy znak ^, który jednak musi być...
Stawi
Beginner
Posty: 209
Rejestracja: 10 lutego 2007, 16:02
Lokalizacja: Kraków

Post autor: Stawi »

sigo pisze:Bez efektu...
Eh, przeszkadza ten początkowy znak ^, który jednak musi być...
Zauwaz gdzie on sie znajduje:
/^[...]/ -> na poczatku musi byc znak z nawiasow kwadratowych
/[^...]/ -> gdziekolwiek znak ktory NIE jest w nawiasach kwadratowych ]na prawdę[/b] duzo znakow, ktore moga byc, to chyba lepiej sprawdzic te pare ktore nie moze?
A tak totalnie z glupa - jestes pewien ze kodowanie wejscia i kodowanie skryptu jest takie samo?
Spróbuj wklepac lancuch do testow na sztywno w kodzie - dla pewnosci ze jest to samo kodowanie.
ODPOWIEDZ