2012-03-05 41 views
27

Tôi biết cách sử dụng preg_match và preg_match_all để tìm các đối sánh thực tế của các mẫu regex trong một chuỗi nhất định, nhưng hàm tôi viết không chỉ cần văn bản của các kết quả phù hợp, mà còn có thể đi qua chuỗi AROUND ...Làm thế nào để có được vị trí của một trận đấu Regex trong một chuỗi?

Vì vậy, tôi cần biết vị trí của khớp trong chuỗi, dựa trên mẫu regex.

Tôi dường như không thể tìm thấy chức năng tương tự như strpos() cho phép regex ... bất kỳ ý tưởng nào?

+0

khi bạn có kết quả khớp, bạn không thể sử dụng 'strpos()' để tìm vị trí của nó? – scibuff

+0

trùng lặp ?: http://stackoverflow.com/questions/3547564/running-a-regular-expression-need-to-find-exact-location-of-a-string-patterns – michaelmichael

+0

Khi bạn có kết quả phù hợp, bạn có thể sau đó sử dụng strpos() để tìm vị trí trong chuỗi. – SenorAmor

Trả lời

59

Bạn có thể sử dụng cờ PREG_OFFSET_CAPTURE cho rằng:

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

Kết quả là:

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

Tại sao lại trả về kết quả hai lần? – ananda

+2

@ananda Trận đấu đầu tiên này là * tất cả * của cụm từ thông dụng. Thứ hai là nhóm chụp đầu tiên. Thật trùng hợp, cả hai đều giống nhau trong đoạn mã trên. Nếu, ví dụ, regex là '/ Foo (bar) /', thì kết quả đầu tiên sẽ là ''Foobar'' với giá trị bằng 0 và kết quả thứ hai sẽ là'' bar'' (với bù ba) ở trên. –

4

preg_match có một lá cờ không bắt buộc, PREG_OFFSET_CAPTURE, ghi lại vị trí chuỗi các điều xảy ra của trận đấu trong bản gốc 'haystack'. Xem phần 'cờ': http://php.net/preg_match

0

Khi sử dụng PREG_OFFSET_CAPTURE trên preg_match(), bạn sẽ nhận được số lần khớp trên mẫu. Khi có kết quả phù hợp, giá trị này sẽ có giá trị bù trừ bắt đầu từ 0.

Sử dụng giá trị này, bạn có thể gọi preg_match lại bằng thông số bù trừ.

Các vấn đề liên quan