2013-04-23 25 views
6

Üzgünüz, şu soruyla ilgili yeni bir sorun daha buldum: Get The Number of Sepecific String Inside String.Dize içindeki belirli karakterlerin sayısını sayma

Çok çalışıyorum, bir dizenin içindeki belirli karakterlerin sayısını nasıl bulabilirim? Durum böyle bir şey.

function get_num_chars($char) { 
    $string = '120201M, 121212M-1, 21121212M, 232323M-2, 32323K, 323232K-1' 
} 

ben count_chars() çalıştı get_num_chars(M-1) would return 1

, substr_count() geçerseniz ben get_num_chars(M) would return 2 geçmesine ama işe yaramazsa.

+1

sorun şey içerdiğinde 'K-1' o da' K' içermesidir. İşlev, bunları saymamak için nasıl bilmeli? Sorunu daha dikkatli tanımlamanız gerekir. – Barmar

+0

@Barmar: OP, K-1'in eşleşmemesi gerektiğini belirtmedi mi? – Aquillo

+0

@Aquillo o belirtmişti ... O (M) 2 dönmek ve (M-1) 1 .... geri dönmek istiyorsa "Barmar" haklı. – sandy

cevap

5

normal ifadesi kullanılarak Muhtemel bir çözüm:

function get_num_chars($char) { 
    $string = '120201M, 121212M-1, 21121212M, 232323M-2, 32323K, 323232K-1'; 
    return preg_match_all('/'.$char.'(?=,|$)/', $string, $m); 
} 

echo get_num_chars('M'); // 2 
echo get_num_chars('M-1'); // 1 
echo get_num_chars('M-2'); // 1 
echo get_num_chars('K'); // 1 
echo get_num_chars('K-1'); // 1 
+0

'+ 1 ' – Aquillo

+0

Harika! Randle çok teşekkür ederim mükemmel çalışıyor. Sadece öğrenmem gerek (? =, | $). –

+0

regular-expression.info sitesinde "lookaround" konusuna bakın. – Barmar

11

O substr_count() ile mümkündür

ben size sorun bunun mümkün olmayabilir, bu deneyin bu

$string = '120201M, 121212M-1, 21121212M, 232323M-2, 32323K, 323232K-1'; 

echo substr_count($string, 'K-1');//echo's 1 

echo substr_count($string, 'K');// echo's 2 
+0

İkincisinin, 1 değil, '2' yankılanmasını istiyor. – Barmar

+0

Evet. Barmar haklı. 'K' ararken, 'K-1' dışlandı. Yani, substr_count ($ string, 'K') 1 –

+0

olası bir çözüm olmalıdır: '$ string = str_replace ('K-1', '', $ string)' 'K-1' sayıldıktan sonra. – mgutt

0

gibi denemek gerektiği gibi değer geçirerek ancak adresleri değildir düşünüyorum

function get_num_chars($char) { 

    $string = '120201M, 121212M-1, 21121212M, 232323M-2, 32323K, 323232K-1'; 
    echo substr_count($string, $char); 
} 
get_num_chars('M,'); 
get_num_chars('M-1'); 
get_num_chars('k,'); 
+0

Peki, son karakter takımı K 'ile biterse ne olur? Sonunda hiç virgül yok. – Aquillo

+0

Daha önce de belirtildiği gibi, K için aranan dize de K-1 ile eşleşecektir. Bu yüzden kodlayıcının kendi girdilerini kontrol etmeleri gerekiyor. – sandy

+0

Evet, ancak '$ string = '120201M, 121212M-1, 21121212M, 232323M-2, 32323K, 323232K-1, 2323K';' deyin. Son giriş, '' K, '' – Aquillo

1
$k_count = substr_count($string, 'K') - substr_count($string, 'K-'); 
$k1_count = substr_count($string, 'K-1'); 

veya

Counting K not followed by dash şöyle:

$k_count = preg_match_all('/*K(?!-)/*', $string, $out); 
+0

Yup bu güzel görünüyorsun .... – sandy

+0

@Aquillo: Genius! harika ......! benim problemimi çözdü. Teşekkür ederim! –

+0

Rica ederim. Tam örnek için – Aquillo

1

Sadece 'M-' veya 'M' geçebilir bu

$string = '120201M, 121212M-1, 21121212M, 232323M-2, 32323K, 323232K-1'; 

$wordCounts = array_count_values(str_word_count($string,1)); 

echo $mCount = (isset($wordCounts['M-'])) ? $wordCounts['M'] : 0; 

Ama burada bir şeyi deneyin değil 'M-1' de bazı geçici çözüm olduğunu Ne istiyorsunuz. Beacuse str_word_count eşleşmeleri tam kelime sayısı kullanılmıştır.

0

Kontrol bu,

$string = '120201M, 121212M-1, 21121212M, 232323M-2, 32323K, 323232K-1'; 
$arrString = explode($string,'M'); 
echo $stringCount = count($arrString); 
İlgili konular