2011-05-12 4 views
8

önce her şeyi yakalamak için EFG dizesinin örneği yakalanır. Ayrıca, EFG dizesi yoksa, tüm dizeyi yakalamak istiyorum.Regex Ben kadar bir desen yakalamak istiyor ancak örneğin preg_match'in ile isteğe bağlı diğer modelin ilk örneğini dahil değil ilk isteğe bağlı dize

Ben şu işe düşündüm olurdu, ama böyle bir şans:

$pattern = '/(.*)(?:EFG)?/'; 
preg_match($pattern, '[email protected]#%GEFGw35hqb', $matches); 
print_r($matches); 
//should give: '[email protected]#%G' 

cevap

16

Sen çok daha az karışıklık ile sonucu olabilir

'/(.*?)(?=EFG|$)/' 
+0

ah çok güzel - EFG veya çizginin sonuna uymayı düşünmedim :) – mulllhausen

+0

'/ (. *?) (?: des | $) /' ayrıca çalışır :) – mulllhausen

2

bu deneyin: (.*?)(?:EFG|$)

Bu (mümkün olduğunca az gibi) herhangi bir karakterle eşleşir o EFG bulana kadar.

Sadece maç için desen daha basit bir sürümünü kontrol edip değilse, orijinal dizeyi kullanın:

+0

sorunu, EFG – mulllhausen

+0

Sağ içermeyen bir diziyle eşleşmeyeceğidir. Çizgi karakterinin sonunu da eşleştirin. (Güncelleme cevabı.) –

+0

Üzgünüz @Josh M., @Jens bunu size yendi: P – mulllhausen

0

kullanabilirsiniz

<?php 
$match = '[email protected]#%GEFGw35hqb'; 
if (preg_match('/^(.*)EFG/', $match, $matches)) { 
    $match = $matches[1]; 
} 

echo $match; 
+0

evet ben de benzer bir şey yapabilirdim '' stripos '' ama ben regex hakkında biraz bilgi edeceğini düşündüm - onun neat imo – mulllhausen

+0

Evet;), eğer performans bir sorunsa, 'strpos';; – Yoshi

1

bir başka yolu bunu yapmak için:

$str = '[email protected]#%GEFGw35hqb'; 
$res = preg_split('/EFG/', $str); 
print_r($res); 
+0

veya daha iyisi 'listeyi ($ match) = kullanmalısınız. preg_split ('/ EFG /', $ haystack) 'dize doğruca boşuna yakalamaya :) – mulllhausen