Nasıl ben bir düzenli ifade ile birden fazla maç buluyorsunuz?

4 Cevap php

Ben aşağıdaki dize var:

response: id="1" message="whatever" attribute="none" world="hello"

Özniteliklerin sırası rastgele. Diğer nitelikleri herhangi bir sayı olabilir.

Bunun yerine, aşağıdaki üç birbiri ardına uygulayarak normal bir ifadede id, mesaj ve dünya özellik almak için bir yolu var mı?

/ message="(.*?)"/
/ world="(.*?)"/
/ id="(.*?)"/

4 Cevap

Bunlardan önünde .* ile üç pozitif ileri yönlü iddialarını kullanarak bunu elde edebilirsiniz:

<?php
$re = '/(?=.* message="(.*?)")(?=.* world="(.*?)")(?=.* id="(.*?)")/';

$string = '<response id="1" message="whatever" attribute="none" world="hello" />';

preg_match($re, $string, $matches);
var_dump($matches);

Çıktı:

array(4) {
  [0]=>
  string(0) ""
  [1]=>
  string(8) "whatever"
  [2]=>
  string(5) "hello"
  [3]=>
  string(1) "1"
}

O 3 parametrelerin herhangi bir eksik varsa tabii, bu model (... de size yardımcı olabilir) başarısız olur. Bunları isteğe bağlı olmasını istiyorsanız, daha fazla olmayan bir yakalama gruba lookahead içini sarmak ve isteğe bağlı (?:....)? (bu örnekte "dünya" parametresi isteğe yapar) yapabilirsiniz

/(?=.* message="(.*?)")(?=(?:.* world="(.*?)")?)(?=.* id="(.*?)")/

Eğer preg_match , then there's an optional third argument which will store all the regular expression groups (parantez içinde bir şey, temelde) yanı sıra tam eşleme kullanıyorsanız.

Yani (1 normal bir ifade ve daha sonra 2, 3 gibi her şeyi kullanmak ve 4. elemanları world, message olacak, ve id, sırasıyla eşleşen tüm dize olacaktır.

Ben bir regex adam değilim, bu yüzden yanlış olabilir. Eğer öyleyse,) = DOWNVote sadece bana bildirin ve ben onu sileceğiz yok! :-D

Eğer ya da birlikte ifadeler ve maç olabilir?

/ (message|world|id)="(.*?)"/

Aşağıda ben gelip iyi biridir. Bu, her noktada eşleşen gerçek özelliklerini yakalama kendi değerlerini ve aynı zamanda inbetween başka bir şey izin vermelidir. Ama kesinlikle doğru değil ve bir "gerçek" ayrıştırıcı kullanmak iyi yapardı.

/((message|attribute|world)="([^"]*)").*?((message|attribute|world)="([^"]*)").*?((?:message|attribute|world)="([^"]*)")/