Regex grubu içinde birden çok maçlar?

3 Cevap php

Ben XML nitelikleri içerisinde meydana gelen tüm 'etiketleri' (örneğin% thisIsATag%) maç gerekir. (Not: Ben geçerli XML almak için garantili değilim, bu yüzden tam DOM kastetmek kullanmaya gerek yoktur). Benim regex tek niteliğinde two etiketleri olduğu zamanlar dışında, çalışıyor, sadece sonuncusu döner.

Diğer bir deyişle, bu düzenli ifade TaG1, tag2, ..., tag6 bulmalıdır. Ancak, tag2 ve Tag5 atlar.

İşte size (PHP) için eğlenceli küçük bir test koşum bulunuyor:

<?php

$xml = <<<XML
<data>
 <slideshow width="625" height="250">

  <screen delay="%tag1%">
   <text x="30%" y="50%" animatefromx="800">
    <line fontsize="32" fontstyle="bold" text="Screen One!%tag2% %tag3%"/>
   </text>
  </screen>

  <screen delay='%tag4%'>
   <text x="30%" y="50%" animatefromx="800">
    <line fontsize='32' fontstyle='bold' text='Screen 2!%tag5%%tag6%'/>
   </text>
  </screen>

  <screen>
   <text x="30%" y="50%" animatefromx="800">
    <line fontsize="32" fontstyle="bold"  text="Screen Tres!"/>
   </text>
  </screen>

  <screen>
   <text x="30%" y="50%" animatefromx="800">
    <line fontsize="32" fontstyle="bold"  text="Screen FOURRRR!"/>
   </text>
  </screen>

 </slideshow>
</data>
XML;

$matches = null;
preg_match_all('#<[^>]+("([^%>"]*%([^%>"]+)%[^%>"]*)+"|\'([^%>\']*%([^%>\']+)%[^%>\']*)+\')[^>]*>#i', $xml, $matches);

print_r($matches);
?>

Teşekkürler! :)

3 Cevap

Ne yapmaya çalışıyorsun regex maç başına birden fazla maç grupların ara yakalar kurtarmak olduğunu. Bildiğim kadarıyla sadece. NET ve Perl 6 bu yeteneği sağlar. Siz iki aşamada işi yapmak zorundayız: bireysel dizileri patlak sonra, içinde bir veya birden fazla %tag% dizileri ile bir öznitelik değeri maç.

Hangi XML etiketi bakım veya değerleri ile ilişkili öznitelik görünmüyor, bu yüzden onları %tag% dizileri ile değerlerini bulmak için bu, biraz daha basit bir regex kullanabilirsiniz:

'#"([^"%<>]*+%[^%"]++%[^"]*+)"|\'([^\'%<>]*+%[^%\']++%[^\']*+)\'#'

EDIT: regex kullanıldığı tırnak hangi bağlı olarak, grup 1 ve grup 2 de nitelik değerini yakalar bu. İşte o zaman grup 2'de değerini kaydedebilirsiniz böylece alternatifleri birleştirir başka bir versiyonu:

'#(["\'])((?:(?![%<>]|\1).)*+%(?:(?!%|\1).)++%(?:(?!\1).)*+)\1#'

Şudur:

(%[a-zA-Z0-9]+%)

yeterli değil mi? Onlar olabilir - örnekte, etiketleri nitelik değerleri dışında herhangi bir yerde görünmüyor?

% \ +% W bunu yapmanın daha basit bir yol olacaktır.