Strona 1 z 1

php - preg_match nie wykrywa apostrofu

: 04 maja 2009, 00:58
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.

: 04 maja 2009, 01:00
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.

: 04 maja 2009, 01:01
autor: sigo
Znak karetki niestety też nie pomaga.

: 04 maja 2009, 01:15
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.

: 04 maja 2009, 01:19
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 ;)

: 04 maja 2009, 01:31
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.

: 04 maja 2009, 01:43
autor: lis6502
Spróbuj wpisać je tak
\x22 cudzysłów
\x27 apostrof

: 04 maja 2009, 01:46
autor: sigo
Bez efektu...
Eh, przeszkadza ten początkowy znak ^, który jednak musi być...

: 06 maja 2009, 02:19
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.