![]() |
![]() |
-gox- |
![]()
Post
#1
|
Goście ![]() |
Jaka jest roznica miedzy:
(.+?) a (.*?) ? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 230 Pomógł: 27 Dołączył: 27.05.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
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- |
![]()
Post
#3
|
Goście ![]() |
Jakos nie bardzo, bo (.*?) nie dopasowuje sie do pustego ciagu...
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 592 Pomógł: 62 Dołączył: 3.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() no chyba, że chciałeś, aby ten podciąg nie był zapamiętany, to wtedy :? piotrekkr, racja zapomniałem ![]() Ten post edytował rzymek01 2.07.2008, 08:20:11 -------------------- :]
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 386 Pomógł: 25 Dołączył: 28.09.2005 Ostrzeżenie: (0%) ![]() ![]() |
? 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. Ten post edytował piotrekkr 29.06.2008, 12:23:44 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 14.12.2007 Ostrzeżenie: (0%) ![]() ![]() |
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? -------------------- Sklep oparty na moim skrypcie
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 386 Pomógł: 25 Dołączył: 28.09.2005 Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 2 Pomógł: 0 Dołączył: 21.04.2007 Ostrzeżenie: (0%) ![]() ![]() |
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:
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
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 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 439 Pomógł: 21 Dołączył: 28.06.2007 Skąd: Bielsko-Biała Ostrzeżenie: (0%) ![]() ![]() |
Dopuszczamy gdy jest jedna spacja(miedzy imieniem i nazwiskiem) oraz 0 lub 1 myślink w nazwisku:) jeszcze możesz wzbogacić i polskie znaki
-------------------- "Na przykład zmiennej $jestem_najlepszy przypisujemy wartość logiczną TRUE"
Ja: użyj funkcji[...] Grins: mów normalnie do mnie a nie po polsku Ja: normalnie to znaczy jak? Grins: No w PHP... inaczej mój parser ledwo kuma:) |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 386 Pomógł: 25 Dołączył: 28.09.2005 Ostrzeżenie: (0%) ![]() ![]() |
Dopuszczamy gdy jest jedna spacja(miedzy imieniem i nazwiskiem) oraz 0 lub 1 myślink w nazwisku:) jeszcze możesz wzbogacić i polskie znaki
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żźćńąśłęóŻŹĆŃĄŚŁĘÓ].
Ten post edytował piotrekkr 11.07.2008, 13:02:41 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 05:55 |