[php]wyrażenia regularne/powtórzenie znaków w stringu

0

Nigdy do konca nie załapałem jak pisze sie wyrazenia regularne, a jest mi to teraz potrzebne, bo obejscie tematu to za duzo kodu.. jak ktos wie gdzie czytelnie napisano jak pisac patterny do eregów to prosze o link.. a tymczasem moj problem jest taki:
chce sprawdzic poprawnosc stringa, a oto wymagania:

  • dokładnie 14 znaków
TO JEST ŹLE napisał(a)

- znaki drugi, czwarty, 6, 8, 10, 12 i 14 to literki (niewazne czy duze/male) N R T S D C lub H

znaki 1, 3, 5, 7, 9, 11, 13 to literki (..) A lub D.. </li> </ul>
TO JEST POPRAWNE napisał(a)

EDIT!!
- znaki drugi, czwarty, 6, 8, 10, 12 i 14 to literki (niewazne czy duze/male) A lub D..

znaki 1, 3, 5, 7, 9, 11, 13 to literki (..) N R T S D C lub H </li> </ul>

wielkie PRZEPRASZAM za moje niedopatrzenie, a później cwaniakowanie "ze to nie tak".. :-(

jak ktos moze napisac mi wyrazenie eregi to prosze :) albo chociaz wyjaśnienie co i jak, bo w manualu to nic nie ma przy funkcji ereg[i]..

0

A może być preg? preg lepszy niż ereg ;-)
Chyba będzie działać:

if (preg_match("/^([AD][NRTSDCH]){7}$/i", $string))
    echo "ok";
else
    echo "error";

I tak w ogóle to polecam: http://www.regular-expressions.info/

0

ok, dzieki, moze byc i preg, dziala ok,

to jest zło! napisał(a)

tylko powinno byc

(preg_match("/^([NRTSDCH][AD]){7}$/i", $string))

zamiast

(preg_match("/^([AD][NRTSDCH]){7}$/i", $string))

a jeszcze mam taki problem ze 1,3,5,7,9,11,13 znak nie moze sie powtorzyc.. jak to szybko napisac? bo oprocz

if ($sort[0] == $sort[2]) {
   if ($sort[0] == $sort[4] {
  /*.....*/

nic mi do glowy nie przychodzi :/

0

Nie moga sie nie powtorzyc, skoro elementow do wyboru masz 2 (A i D), a rozmieszczasz na 7 miejscach.

//edit
@down: a to przepraszam, myslalem ze mowisz juz o wlasciwej wersji

0

@Johny dla

(preg_match("/^([NRTSDCH][AD]){7}$/i", $string))

to elementy 1,3,5,7,9,11,13 moga przyjmowac wartosci N R T S D C H (7 elementow, 7 wartosci)

edit:
ok, dla ułatwienia powiedzmy ze NRTSDCH zmieniamy na NRTSXCH (poniewaz w "zestawie1" jak i "zestawie2" moglo wystepować D, wiec zamiast jakas metoda sprawdzic powtorzenie w stringu trzebaby bylo sprawdzac pojedyncze znaki)

edit2:
Oczywiście powyższe wyjaśnienia spowodowane są blędem w pierwszym poście, sorry

0

a no to znacznie ułatwia sprawę (chociaż wcześniej też nie była szczególnie trudna)
teraz można to zrobić np:

&& !preg_match('/([NRTSXCH]).*\1/i', $string);

chociaż bez wyrażenia by było w tym przypadku znacznie szybciej i mogłoby się powtarzać to "D"
możnaby to chyba zrobić jednym wyrażeniem ale to nie na moje nerwy i wyszłoby chyba coś dosyć skomplikowanego i przetwarzającego się znacznie dłużej niż te dwa proste wyrażenia
można to też załatwić zapisując wyniki do tablicy i sprawdzaniem czy występują w niej duplikaty (minimum dwie funkcje), ale to już powoli staje się zwykłym kodem

btw - wersja Ktosia jest poprawna w/g pierwszego postu, jeśli tobie pasuje odwrotna wersja to albo się pomyliłeś w pierwszym poście albo masz błąd w skrypcie

0

@Adamo, faktycznie, błąd :/ juz poprawiłem wszystko..
A formułka piękna, dzięki, działa jak trzeba :D

to temat do zamknięcia juz moze byc, dzieki!

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