2012-03-05 13 views
27

Wiem, jak używać preg_match i preg_match_all, aby znaleźć faktyczne dopasowania wzorów regex w danym ciągu znaków, ale funkcja, którą piszę, nie tylko wymaga tekstu dopasowań, ale także możliwość przechodzenia przez łańcuch AROUND w dopasowaniach ...Jak uzyskać pozycję dopasowania Regex w ciągu znaków?

Dlatego potrzebuję znać pozycję dopasowania w łańcuchu, w oparciu o wzór regex.

Nie mogę znaleźć funkcji podobnej do strpos(), która pozwala na wyodrębnianie ... jakichkolwiek pomysłów?

+0

kiedy już masz mecz, nie możesz po prostu użyć 'strpos()', aby znaleźć jego pozycję? – scibuff

+0

duplikat ?: http://stackoverflow.com/questions/3547564/running-a-regular-expression-need-to-find-exact-location-of-a-string-patterns – michaelmichael

+0

Gdy już masz swoje mecze, możesz następnie użyj strpos(), aby znaleźć pozycję w ciągu znaków. – SenorAmor

Odpowiedz

59

Możesz użyć flagi PREG_OFFSET_CAPTURE za to:

preg_match('/(bar)/', 'Foobar', $matches, PREG_OFFSET_CAPTURE); 
var_export($matches); 

Wynik jest:

array (
    0 => 
    array (
    0 => 'bar', 
    1 => 3,  // <-- the string offset of the match 
), 
    1 => 
    array (
    0 => 'bar', 
    1 => 3, 
), 
) 
+0

Dlaczego zwrócono wynik dwa razy? – ananda

+2

@ananda Ten pierwszy mecz jest * all * wyrażenia regularnego. Drugi to pierwsza grupa przechwytująca. Przypadkowo oba są takie same w powyższym kodzie. Jeśli na przykład regex to '/ Foo (bar) /', to pierwszym wynikiem będzie '' Foobar'' z przesunięciem równym zero, a drugim wynikiem będzie ''bar'' (z offsetem 3) jako powyżej. –

4

preg_match posiada opcjonalną flagę, PREG_OFFSET_CAPTURE, który rejestruje położenie ciąg wystąpienia meczu w oryginale 'stóg siana'. Zobacz sekcję 'flags': http://php.net/preg_match

0

Za pomocą PREG_OFFSET_CAPTURE na preg_match() dostaniesz liczbę razy na zapałkach we wzorze. W przypadku dopasowania wartość ta będzie miała wartość offsetu, która rozpoczyna się od 0.

Używając tej wartości, można ponownie wywołać preg_match za pomocą parametru przesunięcia.

Powiązane problemy