2011-09-21 28 views
6

içinde herhangi bir sayının ilk oluşan konumunu bulmak, birisi dizideki herhangi bir sayının ilk oluşan konumunu bulmak için algoritma yardımcı olabilir?String (php)

Kod i web üzerinde bulunan ve çalışmaz:

function my_ofset($text){ 
    preg_match('/^[^\-]*-\D*/', $text, $m); 
    return strlen($m[0]); 
} 
echo my_ofset('[HorribleSubs] Bleach - 311 [720p].mkv'); 
+0

deneyin preg_match ('/ [\ d] + /', $ metin, $ m); – user269867

+0

Ayrıca, düzenli ifadeleri test etmek ve hata ayıklamak için çevrimiçi bir "python regex repl" kullanmak için kullanışlı buluyorum. Örneğin: https://pythex.org – SherylHohman

cevap

12
function my_ofset($text){ 
    preg_match('/^\D*(?=\d)/', $text, $m); 
    return isset($m[0]) ? strlen($m[0]) : false; 
} 

bunun için çalışmalıdır. Orijinal kod, ilk numaradan önce gelmek için bir - gerekiyordu, belki de sorun buydu?

+0

dizede sayı yoksa, orijinal dizenin uzunluğunu döndürür? – Gasper

+0

@ gašper: Sağ. Sabit olabilir, ama Stanislav'un ​​çözümü çok daha iyi. –

+0

Onun çözümü neden daha iyi? string içinde sayı yoksa, bana 1 değerini verir (algoritması ile). eğer seninkini kullanırsam, bana mantıklı bir şey verir (string uzunluğu). – Gasper

18
function my_offset($text) { 
    preg_match('/\d/', $text, $m, PREG_OFFSET_CAPTURE); 
    if (sizeof($m)) 
     return $m[0][1]; // 24 in your example 

    // return anything you need for the case when there's no numbers in the string 
    return strlen($text); 
} 
+2

Daha mantıklı. Ben (ve RegexBuddy) 'PREG_OFFSET_CAPTURE' hakkında bilmiyordum :) –

0

ben normal ifadeler yapabiliriz ama onu kodlu sonra ne yaptığını hatırlamak için değişmiş bir duruma gitmek zorunda. İşte

kullanabileceğiniz basit bir PHP fonksiyonu ...

function findFirstNum($myString) { 

    $slength = strlen($myString); 

    for ($index = 0; $index < $slength; $index++) 
    { 
     $char = substr($myString, $index, 1); 

     if (is_numeric($char)) 
     { 
      return $index; 
     } 
    } 

    return 0; //no numbers found 
}