php regex - iki olası dize hazır denetimi bir ifadede değerleri

1 Cevap php

: Ben php preg_match kullanıyorum ve orijinal ifade var

|(label\">Carried Price    </span> £)((.)*?)( </div)|

Ama aynı temel ifadeyi kullanmak mümkün edebilmek mümkün ama Taşınan Fiyat veya Web Exclusive aramak için mümkün olmak istiyorum. Ben böyle bir şey denedim:

|(label\">[Carried Price|Web Exclusive]    </span> £)((.)*?)( </div)|

Ama şans, herhangi bir fikir? Ben de 3 gruplaşmalar olarak regex bu yapısını korumak zorunda.

Additional kod Ben örnek metin ile test etmek için kullanıyorum

$page = '  <div class="web-exclusive-price">     <span class="label">Web Exclusive 
</span> £399.00 </div>
   <div class="web-only-label">     <span class="label">Offer not available in-store    </span>  </div>
    <div class="deliveryShortcut">        <span class="label"><a href="#deliverySection" onclick="navigateOpenSection(\'delivery\');">Standard Delivery</a></span> Free    </div>
';

$r = '|(label\">(?:Carried Price|Web Exclusive)    </span> £)((.)*?)( </div)|';

preg_match($r, $page, $matches);

1 Cevap

Bunun için yuvarlak parantez gerekir. Kare parantez [] karakter kümesi belirtmek için kullanılır. İşte sabit sıradanifade olduğunu:

$r = "'(label\">(?:Carried Price|Web Exclusive)\s+</span> £)((.)*?)( </div)'";

Sembol (?:...) non-yakalama grubunu ifade eder. İşte grupları hakkında daha fazla bilgi http://www.regular-expressions.info/named.html

Update 1:

Ayrıca, regexp is not the best way to parse html. allternavite way using SimpleXML bak.

Update 2 (thanks to Tim Pietzcker):

Eğer sıradanifade Ayraç olarak | kullanıyorsanız o zaman regexp içinde kullanamazsınız. I ' sembolü ile değiştirir ettik. \s+ herhangi sayıda maç için kullanılır. Şimdi test kodu çalışıyor. Yukarıdaki örneğe bakın.