2011-05-28 16 views
23

* joker karakteriyle dizgi eşleştirme olanağı vermek istiyorum.php dize joker karakteriyle eşleştirme *?

Örnek

$mystring = 'dir/folder1/file'; 
$pattern = 'dir/*/file'; 

stringMatchWithWildcard($mystring,$pattern); //> Returns true 

Örnek 2:

function stringMatch($source,$pattern) { 
    $pattern = preg_quote($pattern,'/');   
    $pattern = str_replace('\*' , '.*?', $pattern); //> This is the important replace 
    return (bool)preg_match('/^' . $pattern . '$/i' , $source); 
} 

Temelde * eşleşir ortamda *.*? için (dikkate değiştirilmesi:

$mystring = 'string bl#abla;y'; 
$pattern = 'string*y'; 

stringMatchWithWildcard($mystring,$pattern); //> Returns true 

ben gibi bir şey düşündümdize) © vbence

Herhangi bir gelişme/öneri var mı? preg_match döner

cevap

35

.

fnmatch()

Ve fnmatch('dir/*/file', 'dir/folder1/file') olasılıkla zaten sizin için de kullanılabilir: PHP özellikle bu tür durumlar için yapılmış bir joker karşılaştırma işlevi vardır. Ancak, * joker karakterinin, preg_match gibi daha fazla eğik çizgi ekleyeceğini de unutmayın.

+0

Merhaba mario. fnmatches, [] 'gibi başka bir özelliğe sahiptir. Sadece "özel char" olarak ihtiyacım var * – dynamic

+2

fnmatch, POSIX olmayan sistemlerde desteklenmiyor. (Php5.3 + 'nın şimdi de pencereleri desteklediğini görüyorum). Yani bu her zaman en iyi yol değildir – Pinoniq

0

int çünkü

// Eklendi return (bool)

sen gerekecek bir sorun preg_quote() çağrısı yıldız karakterini kaçmak olacaktır. Bunu göz önüne alarak, str_replace(), * yerini alacak, ancak önündeki çıkış karakterini değil. Sadece yerine .* kullanmalıdır str_replace('*' ..)str_replace('\*'..)

+0

Bunu belgeselden kötü anladım. Sabit – dynamic

1

ile

nedenle değişmelidir.

$pattern = str_replace('*' , '.*', $pattern); //> This is the important replace 

Düzenleme: Ayrıca ^ ve $ sırası yanlıştı.

<?php 

function stringMatchWithWildcard($source,$pattern) { 
    $pattern = preg_quote($pattern,'/');   
    $pattern = str_replace('\*' , '.*', $pattern); 
    return preg_match('/^' . $pattern . '$/i' , $source); 
} 

$mystring = 'dir/folder1/file'; 
$pattern = 'dir/*/file'; 

echo stringMatchWithWildcard($mystring,$pattern); 



$mystring = 'string bl#abla;y'; 
$pattern = 'string*y'; 

echo stringMatchWithWildcard($mystring,$pattern); 

Çalışma demo: http://www.ideone.com/mGqp2

+0

Bu '' dir // file '' ile 'dir/*/file' ' – dynamic

+0

'ile eşleşme olasılığını vermek isteyip istemediğimi bilmiyorum. *' açgözlü, geri kalan her şeyi yiyecektir Dize, patters ile devam etmek için sadece en az sayıda karakter yok. Yani sonra bir şeyiniz varsa. * 'Sonuç her zaman yanlış olacaktır. – vbence

+0

Açıklamanızdan tam olarak ne istediğini.. +? 'Diye düşündüm. – Dogbert

2
.+? 

tüm karakterler için olmayan açgözlü eşleme neden olur. Bu, boş dizeyle eşleşmeyeceği için "*" değerine eşit DEĞİLDİR.

aşağıdaki model çok boş dize eşleşir: böylece

.*? 

...

stringMatchWithWildcard ("hello", "hel*lo"); // will give true 
+0

ile tanımlanmış mıyım boş dizgiye izin vermeliyim? Dir de düşünün: '' dir // file '' 'dir/*/file '' ile eşleşiyor mu? – dynamic

+0

İşletim sistemi kabuklarının nasıl çalıştığına benzemesini istiyorsanız, boş dizeye izin vermeniz gerekir. Sadece “echo> merhaba” yı, sonra da “merhaba”, pencerelerde veya * nix'de * ls merhaba diyebilirsiniz. Bu bağlamda * boş dizeyle eşleşir. – vbence

+0

Senin -1 ile bir yorum vermek kibar olurdu. – vbence

2

Sen ($) biten yukarı karıştırma ve (^) başlıyoruz. Bu:

preg_match('/$' . $pattern . '^/i' , $source); 

olmalı: Burada preg_match için gerek yoktur

preg_match('/^' . $pattern . '$/i' , $source);