Gruptaki tüm maçlar pozisyonunu alın

2 Cevap php

Aşağıdaki örneği inceleyin:

$target = 'Xa,a,aX';
$pattern = '/X((a),?)*X/';
$matches = array();
preg_match_all($pattern,$target,$matches,PREG_OFFSET_CAPTURE|PREG_PATTERN_ORDER);
var_dump($matches);

Sadece dönüyor neyi son 'a' serisinin, ama ne gerekir tüm 'bir' dır.

Özellikle, ben, böylece PREG_OFFSET_CAPTURE ALL EACH OF 'dizesi içinde en separately konumunu gerekir.

http://stackoverflow.com/questions/1799419/pattern-matching-an-array-not-their-elements-per-se: örnek çok daha karmaşık, ilgili soruya bakın edilir

Teşekkürler

2 Cevap

Bu gruplar tek bir maç regex X((a),?)*X tüm dizeyi eşleşir beri. Son ((a),?) gruplandırılmış olacak.

Ne eşleştirmek istediğiniz bir a o (ve dize başlangıç), bir {[(1) öncesinde bunun bir virgül vardır, ya da olan bir X daha önce sahip ]} bunun öncesinde (ve dize sonu).

$target = 'Xa,a,aX';
$pattern = '/(?<=^X)a|a(?=X$|,)/';
preg_match_all($pattern, $target, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

Çıktı:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => a
                    [1] => 1
                )

            [1] => Array
                (
                    [0] => a
                    [1] => 3
                )

            [2] => Array
                (
                    [0] => a
                    [1] => 5
                )

        )

)

Lütfen regex X olduğunda, bu kez eşleşir. Onu grupları ile büyük bir eşleşme bulur. Ne istediğiniz birçok maçı kendi konumu ile her biri.

Yani, benim görüşüme göre yapabileceğiniz en iyi basitçe / a / veya / a? / Herhangi X'te olmadan arama edilir Sonra [0] 'a' bütün görünüşe içerecektir maçları

Eğer X arasındaki bunları gerekirse, dize bu bölümü önceden seçebilirsiniz.