2012-03-05 15 views
27

私はpreg_matchとpreg_match_allを使用して、指定された文字列内の正規表現パターンの実際の一致を見つける方法を知っていますが、私が書いている関数は一致のテキストを必要とするだけでなく、 ...文字列の正規表現一致の位置を取得するには?

したがって、正規表現パターンに基づいて、文字列内の一致の位置を知る必要があります。

正規表現を許可するstrpos()と似た関数を見つけることができません...任意のアイデア?

+0

一度一致すると、 'strpos()'を使ってその位置を見つけることができませんか? – scibuff

+0

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

+0

あなたの試合ができたらstrpos()を使用して文字列内の位置を見つけます。 – SenorAmor

答えて

59

あなたはそのためのフラグPREG_OFFSET_CAPTUREを使用することができます。

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

結果は次のとおりです。

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

なぜ結果が2回返されましたか? – ananda

+2

@anandaこの最初の一致は、正規表現の* all *です。 2番目は最初のキャプチャグループです。偶然、上記のコードではどちらも同じです。たとえば、正規表現が '/ Foo(bar)/'だった場合、最初の結果はオフセットが0の 'Foobar'で、2番目の結果は' bar''(オフセットが3)です。上記。 –

4

するpreg_matchは元に試合の出現の文字列の位置を記録オプションのフラグ、PREG_OFFSET_CAPTUREを、持っています'干し草'。

0

preg_match()でPREG_OFFSET_CAPTUREを使用すると、パターンの一致回数が取得されます。一致する場合、オフセット値は0から始まります。

この値を使用すると、オフセットパラメータを使用してpreg_matchを再度呼び出すことができます。

関連する問題