Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] wyrazenia regularne
-gox-
post
Post #1





Goście







Jaka jest roznica miedzy:
(.+?)
a
(.*?)
?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
nithajasz
post
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..
Go to the top of the page
+Quote Post
-gox-
post
Post #3





Goście







Jakos nie bardzo, bo (.*?) nie dopasowuje sie do pustego ciagu...
Go to the top of the page
+Quote Post
rzymek01
post
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 smile.gif

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

piotrekkr, racja zapomniałem smile.gif

Ten post edytował rzymek01 2.07.2008, 08:20:11


--------------------
:]
Go to the top of the page
+Quote Post
piotrekkr
post
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
Go to the top of the page
+Quote Post
lubomir1973
post
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
Go to the top of the page
+Quote Post
piotrekkr
post
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.
Go to the top of the page
+Quote Post
macth
post
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:

  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
Go to the top of the page
+Quote Post
dadexix
post
Post #9





Grupa: Zarejestrowani
Postów: 439
Pomógł: 21
Dołączył: 28.06.2007
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


  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. ?>


--------------------
"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:)
Go to the top of the page
+Quote Post
piotrekkr
post
Post #10





Grupa: Zarejestrowani
Postów: 386
Pomógł: 25
Dołączył: 28.09.2005

Ostrzeżenie: (0%)
-----


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żźćńąśłęóŻŹĆŃĄŚŁĘÓ].

Ten post edytował piotrekkr 11.07.2008, 13:02:41
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 05:55