czwartek, 3 stycznia 2008

zachłanność w RegExp PHP

Na początek definicje i przykłady:
Kwantyfikatory umożliwiają definiowanie wyrażeń regularnych, które dopasowują się do określonej liczby (zakresu) znaków, wzorców lub klas znaków.

    Przykłady:
  • {1}dokładnie jedno wystąpienie

  • {0,3}brak wystąpienia lub trzy wystąpienia

  • {,3}to co powyżej

  • {3,9}co najmniej 3, ale nie więcej niż 9 wystąpień

  • {3,}co najmniej 3 wystąpienia bez limitu



    skróty:
  • * równoznaczne z {0,}dowolna liczba wystąpień; zero lub więcej wystapień

  • + równoznaczne z {1,}wymaga najmniej jednego wystąpienia lub więcej; jeden lub więcej wystąpień

  • ? równoznaczne z {0,1}dopasowuje brak lub dokładnie jedno wystąpienie; zero lub jedno wystąpienie



Z powyższych przykładów możemy wyodrębnić pewną specyficzną grupę kwantyfikatorów charakteryzującą się "brakiem granic" lub rozległymi granicami:
*, +, ?, {n}, {n,} oraz {n,m}.
Tak określonym kwantyfikatorom nadano nazwę zachłanne.

Zachłanność powoduje dopasowywanie do maksymalnej możliwej liczby wyszukiwanych wzorców w napisie.

Aby ułatwić także znajdziemy coś odwrotnego a mianowicie dopasowanie niezachłanne.

Leniwość, wyłączenie zachłanności powoduje dopasowywanie do minimalnej możliwej liczby wyszukiwanych wzorców w napisie.

    Sposoby wyłączenia zachłanności:
  1. dodając do wyrażenia regularnego modyfikator /U

  2. dodając do kwantyfikatora ? np. *?, +?, ??, {n}?, {n,}? oraz {n,m}?



Doskonałym przykładem obrazującym działanie zachłanności jest kod html.
przykładowy kod html:
<p>raz</p> dwa trzy cztery <p>zero</p>
wyrażenie zachłanne:
<p>.*</p> spowoduje dopasowanie do całego napisu: <p>raz</p> dwa trzy cztery <p>zero</p>

wyrażenie nie zachłanne:
<p>.*?</p> spowoduje dopasowanie do części napisu: <p>raz</p>