% Arasında dize eşleştirmek için Regex

6 Cevap php

Ben '% s içine ancak preg_match_all, aynı çizgide, aynı anda birkaç dahil görünüyor olan altdizgelerin maç için çalışıyorum.

Kod bu gibi görünüyor:

preg_match_all("/%.*%/", "%hey%_thereyou're_a%rockstar%\nyo%there%", $matches);
print_r($matches);

Hangi aşağıdaki çıktıyı üretir.

Array
(
    [0] => Array
        (
            [0] => %hey%_thereyou're_a%rockstar%
            [1] => %there%
        )

)

Ancak ben bunun yerine şu diziyi üretmek istiyorum:

[0] => %hey%
[1] => %rockstar%
[2] => %there%

Ne eksik?

6 Cevap

"." normal ifadede "[^%]" ile değiştirin:

preg_match_all("/%[^%]*%/", "%hey%_thereyou're_a%rockstar%\nyo%there%", $matches);

Ne oluyor "." her şey dahil, muhtemelen olabildiğince çok eşleşen "iştahla" olduğunu up-hattında nihai%. Negatif karakter sınıfı ile değiştirilmesi "[^%]" yerine yalnızca istediğiniz bit maç yapacak bir şey except bir yüzde, maç anlamına gelir.

Başka bir seçenek, "açgözlü olmayın" söyler nokta, sonra bir "?" yerleştirmek olacaktır:

preg_match_all("/%.*?%/", "%hey%_thereyou're_a%rockstar%\nyo%there%", $matches);

Yukarıdaki örnekte, opsiyon ya ancak orada bir tek bir karakter daha büyük bir şey, bu yüzden reddedildiği karakter sınıfı yardımcı olmaz arıyor olabilir zamanlar, bu nedenle çözüm un-greedify maç olduğunu çalışacaktır.

Sen açgözlü bir maç yapıyoruz - ? bunu ungreedy yapmak için kullanabilirsiniz:

/%.*?%/

Bir satır maç içinde oluşabilir, s (dotall) değiştirici ekleyin:

/%.*?%/s

Bir ekleme? * sonra:

preg_match_all("/%.*?%/", "%hey%_thereyou're_a%rockstar%\nyo%there%", $matches);

Bunun nedeni yıldız gözlü olmasıdır. Yani yıldız regex motoru belirteç mümkün olduğunca sık önceki tekrarlamak neden vardır. Denemelisiniz. *? yerine.

Bu sadece yüzde işaretleri olmayan karakterleri eşleştirmek istediğiniz yüzde işaretleri arasındaki gelir - Sen /%[^%]+%/ deneyebilirsiniz.

Ayrıca, belki, örneğin, desen ungreedy yapabilir /%.+%/U, bu (bence) mümkün olduğunca az yakalamak böylece.

|% (\ W +)% | Bu istiyorsun tam olarak ne çalışacaktır.