Boş geribaşvuru PHP maç hatası neden olur ...

0 Cevap php

Ben bir potansiyel boş geribaşvuru kullanan PHP düzenli bir ifade ile sorun yaşıyorum. Ben de açıklandığı gibi bu işe umuduyla http://www.regular-expressions.info/brackets.html edildi:

If a backreference was not used in a particular match attempt (such as in the first example where the question mark made the first backreference optional), it is simply empty. Using an empty backreference in the regex is perfectly fine. It will simply be replaced with nothingness.

Ancak PHP http://php.net/manual/en/regexp.reference.back-references.php dan ... biraz farklı görünüyor:

If a subpattern has not actually been used in a particular match, then any back references to it always fail.

Basitleştirilmiş bir örnek olarak, ben bu regex ile şu iki şey maç istiyorum:

  • {Bir şey} ... {/ something}
  • {Bir şey: else} ... {/ şey:} else

Nerede "şey" vaktinden bilinir ve "başka" bir şey (veya bir şey) olabilir.

bu yüzden ("else" basitlik için kodlanmış) aşağıdaki regex çalıştı:

preg_match("/\{(something(:else)?)\}(.*?)\{\/something\\2\}/is", $data, $matches)

Ne yazık ki: if (else)? \ 2 geribaşvuru başarısız, eşleşmiyor. Hiç iyi değil: I \ 2 isteğe bağlı (? \ 2), sonra {şey} maç olabilir ... {başka bir şey} yaparsanız.

Düzenli ifadeler (rezil "bir ayrıştırıcı değil, bir regex gerek") bir sınırlama içine çalıştırmak veya bu tamir edilebilir mi?

Test programı:

<?php
    $data = "{Bir şey} ... {/ something}
             {Bir şey: else} ... {/ şey:} else
             {something:else} ... {/something}";

    // won't match {Bir şey} ... {/ something}
    preg_match_all("/\{(something(:else)?)\}(.*?)\{\/something\\2\}/is", $data, $matches);
    print_r($matches);

    // change \\2 to \\2? and it matches too much
    preg_match_all("/\{(something(:else)?)\}(.*?)\{\/something\\2?\}/is", $data, $matches);
    print_r($matches);
?>

0 Cevap