PHP nasıl gruplandırılmış ne sadece döndüren bir regex tamamlarım

3 Cevap php

Ben gruplama kullanarak bir regex gerçekleştirmek istiyorum. Ben gruplama sadece ilgileniyorum, kendi istediğim döndü. Bu mümkün mü?

$haystack = '<a href="/foo.php">Go To Foo</a>';
$needle = '/href="(.*)">/';
preg_match($needle,$haystack,$matches);
print_r($matches);

//Outputs
//Array ( [0] => href="/foo.php">  [1] => /foo.php ) 

//I want:
//Array ( [0] => /foo.php ) 

3 Cevap

Aslında bu lookarounds ile mümkündür. Yerine:

href="(.*)">

İstediğiniz

(?<=href=").*(?=">)

Şimdi bu uygun (ve bu nedenle bir grup olarak ele 0) bir .* o href=" öncesinde ve "> takip edecektir. Ben çok gerçekten yerine açgözlü .*? yerine, yani isteksiz gerektiğini sanıyorum unutmayın.

---A--Z---A--Z----
   ^^^^^^^^^^^
      A.*Z

Her durumda, bu PHP'nin preg PCRE'nin gibi görünüyor, bu yüzden lookarounds desteklemelidir.

regular-expressions.info links

  • Lookaround
  • Flavor comparison
    • PHP'nin preg fonksiyonlar PCRE lezzet uygulamak.
    • PCRE:
      • (?=regex) (pozitif ileri yönlü): VAR
      • (?<=text) (pozitif Geriye bakan): Sabit + münavebe

Demonstration

<?php

$haystack = '<a href="/foo.php">Go To Foo</a><a href="/bar.php">Go To Bar</a>';
$needle = '/(?<=href=").*?(?=">)/';
preg_match_all($needle,$haystack,$matches);
print_r($matches);     

?>

Running this on ideone.com üretir:

Array
(
    [0] => Array
        (
            [0] => /foo.php
            [1] => /bar.php
        )

)

Related questions

Bunlar çoğunlukla Java, ancak regex kısmı lookarounds / onaylamaları kullanarak kapsar:

Hayır 0 indeks her zaman maçlar değil, gruplar oldu metin olacaktır. Tabii ki, sadece ilk öğe kaldırmak ve dizi yeniden numaralandırabilirsiniz.