O göz arkasında veya yakalama gruplarını kullanmak daha iyidir?

2 Cevap php

Bunlardan biri 'iyi' ise diğer ise emin değilim, ve neden olurdu, ama bu gibi görünüyor orijinal bir dize var:

$string = '/random_length_user/file.php';

Şimdi, bu maç için iki yol, ilk olmadan, benim yeni görünüm arkasında arkadaşı, ve 2nd kullanarak vardır:

preg_match("%(?<=^/)([^/]*)%", $string, $capture);
preg_match("%^/([^/]*)%", $string, $capture);

Bunlar sırayla, dönüş:

Array
(
    [0] => random_length_user
)
Array
(
    [0] => /random_length_user
    [1] => random_length_user
)

Esasen ben $ yakalama [0] olmadan [1] göz arkasında kullanarak, $ ve yakalama istediğiniz sonucu alırsınız. Şimdi ... diğer üzerinden bu yöntemlerden birini tercih etme sebebi soru var mı?

2 Cevap

Sorun Geriye bakan bir yaklaşım olarak esnek olmasıdır; değişken uzunlukta maçları ile ilgili başlattığınızda aşağı düşer. Örneğin, sizin örnekte dosya adını çıkarmak istedim varsayalım, ve dizinin adını bilmiyordum. Yakalama-grup tekniği hala çalışıyor:

preg_match("%^/\w+/([^/]*)%", '/random_length_user/file.php');

Array
(
    [0] => /random_length_user/file.php
    [1] => file.php
)

Geriye bakan ifadeler yalnızca bir karakter sabit sayıda maç çünkü ... ama Geriye bakan yaklaşım değil. Ancak, daha iyi bir alternatif var: \K, MAÇ RESET operatörü. Nereye koyarsın, regex motoru maç gerçekten orada başladı miş. Yani sabit uzunluk sınırlaması olmaksızın, aynı sonucu bir Geriye İlerleme yaptığınız gibi olsun:

preg_match('%^/\w+/\K[^/]+$%', '/random_length_user/file.php');

Array
(
    [0] => file.php
)

Bildiğim kadarıyla, bu özellik PCRE kütüphane tarafından güçlendiriliyor (PHP'nin preg_ işlevleri gibi) Perl 5.10 + ve araçları kullanılabilir. PCRE referans için bakınız the manpage ve \K için (F3) arayın.

Muhtemelen preg_match ile bir fark yapmaz, ama değiştirilmesi ne etkilediği gibi, preg_replace kullanırken zaman önemli olacaktır.

Eğer küresel bir maç yaptığınızda yakalayan grup karakterleri tüketir çünkü lookarounds olmaz ise o da, bir sorun olabilir

Önemsiz bir örnek:

  • /(?<=a)a/g ile 'aaaa' verir Array('a', 'a', 'a')
  • /(a)a/g ile 'aaaa' verir Array('aa', 'aa')