Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] wyrazenia regularne
Forum PHP.pl > Forum > Przedszkole
gox
Jaka jest roznica miedzy:
(.+?)
a
(.*?)
?
nithajasz
Gwiazdka * po symbolu, (nawiasie, pojedynczym znaku) oznacza zero lub więcej wystąpień poprzedzającego wyrażenia.
Plus + po symbolu oznacza co najmniej jedno wystąpienie poprzedzającego go wyrażenia.
Znak zapytania ? po symbolu oznacza najwyżej jedno (być może zero) wystąpienie poprzedzającego wyrażenia.

Czyli (.+?) oznacza, że wystąpuje przynajmniej jedno wystąpienie poprzedzającego wyrażenia.
Natomiast (.*?) oznacza, że może wystąpić jedno, ale nie musi.

Jakoś tak..
gox
Jakos nie bardzo, bo (.*?) nie dopasowuje sie do pustego ciagu...
rzymek01
samo (.*)

po co dawać (.*?) jesli wystarczy samo (.*)
i po co dawać (.+?) jeśli to się ze sobą kłóci, bo najpierw jakby chcesz aby było od 1 do n, a potem od 0 do 1, bezsensu smile.gif

no chyba, że chciałeś, aby ten podciąg nie był zapamiętany, to wtedy :?

piotrekkr, racja zapomniałem smile.gif
piotrekkr
? po * lub + sprawia że gwiazdka/plus nie jest zachłanna tzn jeśli jest np:
Kod
'zaq;wsx;kkk'
i masz wzorzec
Kod
/(.*?);/
to zapamięta Ci tylko
Kod
zaq
a nie
Kod
zaq;wsx
.

Tutaj masz wycinek z manuala:

Cytat
By default, the quantifiers are "greedy", that is, they match as much as possible (up to the maximum number of permitted times), without causing the rest of the pattern to fail. The classic example of where this gives problems is in trying to match comments in C programs. These appear between the sequences /* and */ and within the sequence, individual * and / characters may appear. An attempt to match C comments by applying the pattern /\*.*\*/ to the string /* first comment */ not comment /* second comment */ fails, because it matches the entire string due to the greediness of the .* item.

However, if a quantifier is followed by a question mark, then it ceases to be greedy, and instead matches the minimum number of times possible, so the pattern /\*.*?\*/ does the right thing with the C comments. The meaning of the various quantifiers is not otherwise changed, just the preferred number of matches. Do not confuse this use of question mark with its use as a quantifier in its own right. Because it has two uses, it can sometimes appear doubled, as in \d??\d which matches one digit by preference, but can match two if that is the only way the rest of the pattern matches.

If the PCRE_UNGREEDY option is set (an option which is not available in Perl) then the quantifiers are not greedy by default, but individual ones can be made greedy by following them with a question mark. In other words, it inverts the default behaviour.
lubomir1973
Skorzystam aby nie zakładać nowego tematu.

Nie potrafię sobie poradzić z napisaniem wyrażenia, które sprawdza czy w stringu jest:
- przynajmniej jedna litera w dowolnym miejscu,
- przynajmniej jedna liczba w dowolnym miejscu,
- przynajmniej jeden dozwolony znak specjalny w dowolnym miejscu.

String może zawierać następujące znaki |^[a-zA-Z0-9!\?=;:@#\$%\^&*\^\+.>,<]{8,32}$/i|

Zastosowanie to sprawdzanie poprawności wprowadzanego hasła (wymuszenie mocnego hasła).

Czy można zawrzeć te warunki w jednym wyrażeniu?
piotrekkr
Według mnie da się ale będzie dość długie wyrażenie uwzgledniające wszystkie 6 możliwości czyli tak orintacyjnie:
Kod
/(([litera]+[cyfra]+[znak]+)|([litera]+[znak]+[cyfra]+)|([cyfra]+[litera]+[znak]+)|([cyfra]+[znak]+[litera]+)|([znak]+[litera]+[cyfra]+)|([znak]+[cyfra]+[litera]+)){8,32}/

dlatego moim zdaniem lepiej wykonać 3 razy preg_match chociaż bycmoże istnieje jakiś prostszy wzorzec ale jak narazie żaden mi nie przychodzi do głowy.
macth
To może i ja się podepnę...

Chodzi mi o coś takiego:

Człowiek podaje w formularzu imię i nazwisko. I chciałbym je teraz sprawdzić... No bo wiadomo, że dane te nie powinny mieć np. znaków !@#$%^& oraz cyfr. Więc znalazłem rozwiązanie:

  1. <?php
  2. $dopuszczalne_znaki = '/^[a-zA-Z]+$/D';
  3. if (!(preg_match($tekst_znaki, $_POST['nazwisko']))) { echo 'Próbujesz wykonać nieprawidłową operację'; }
  4. ?>



No ale teraz trafi mi się delikwent posiadający nazwisko np. "Kowalski-Zając", a nie daj Boże razem z kompletem imion np. "Karol Zenek" (czyli "Karol Zenek Kowalski-Zając")" i powyższe się już nie sprawdza... Jeżeli rozszerzę $dopuszczalne_znaki

  1. <?php
  2. $dopuszczalne_znaki = '/^[a-zA-Zs-]+$/D';
  3. ?>


to wtedy mogę podawać imiona oddzielone spacją bądź dwuczłonowe nazwiska, ale pojawia się znowu kolejny problem. Jakiś żartowniś może podać jako imię "Jan Marek Armando Ramirez Huan", albo nazwisko "Nowak-------Zając"...


W jaki sposób zrobić ograniczenie możliwości użycia myślnika lub spacji tylko do jednego razu??


Pozdrawiam
dadexix
  1. <?php
  2. $dopuszczalne_znaki = '/^[a-zA-Z]s[a-zA-Z-]+$/D';
  3. ?>

Dopuszczamy gdy jest jedna spacja(miedzy imieniem i nazwiskiem) oraz 0 lub 1 myślink w nazwisku:) jeszcze możesz wzbogacić i polskie znaki
  1. <?php
  2. $dopuszczalne_znaki = '/^[a-zążźćńęłA-ZĄŻŹĆŃĘŁ]s[a-zA-Z-]+$/D';
  3. ?>
piotrekkr
Cytat(dadexix @ 11.07.2008, 04:55:21 ) *
  1. <?php
  2. $dopuszczalne_znaki = '/^[a-zA-Z]s[a-zA-Z-]+$/D';
  3. ?>

Dopuszczamy gdy jest jedna spacja(miedzy imieniem i nazwiskiem) oraz 0 lub 1 myślink w nazwisku:) jeszcze możesz wzbogacić i polskie znaki
  1. <?php
  2. $dopuszczalne_znaki = '/^[a-zążźćńęłA-ZĄŻŹĆŃĘŁ]s[a-zA-Z-]+$/D';
  3. ?>

to raczej też nie zadziała bo dopuszcza kilka myślników na końcu i tylko jeden znak na początku. Poza tym \s nie jest określeniem tylko spacji ale białęgo znaku a to jest także tabulacja, znak powrotu karetki itd.

Proponuje takie coś:
Kod
/^[a-zA-ZżźćńąśłęóŻŹĆŃĄŚŁĘÓ]+ ([a-zA-ZżźćńąśłęóŻŹĆŃĄŚŁĘÓ]+|([a-zA-ZżźćńąśłęóŻŹĆŃĄŚŁĘÓ]+-[a-zA-ZżźćńąśłęóŻŹĆŃĄŚŁĘÓ]+))/
to znaczy tyle co: chociaz jeden znak z grupy [a-zA-ZżźćńąśłęóŻŹĆŃĄŚŁĘÓ] w imieniu, potem spacja, potem albo chociaz jeden znak z grupy [a-zA-ZżźćńąśłęóŻŹĆŃĄŚŁĘÓ] jako nazwisko albo jako nazwisko chociaż jeden znak z grupy [a-zA-ZżźćńąśłęóŻŹĆŃĄŚŁĘÓ] nestepnie myślnik i następnie znów chociaż jeden znak z grupy [a-zA-ZżźćńąśłęóŻŹĆŃĄŚŁĘÓ].
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.