String içerisinde karekter tanima sorunu (php)

mamanybono

Öğrenci
Katılım
15 Eylül 2012
Mesajlar
9
Reaksiyon puanı
0
Puanları
0
Merhabalar,

Şu anda CIDR formatındaki bi ip listesini veritabanına yazacak bi kod yazamaya çalışıyorum. Kodun bi parçası aşağıdaki gibi, bu aşağıdaki kodla şunu yapmaya çalışıyorum CIDR formatondaki(5.2.80.0/21 5.11.128.0/17) ip listesinden, her 3 üncü noktanın ve "/" karekterinin ve "boşluk" karekterinin yerini bi dizinin içine atmaya çalışıyorum. Kodları bi kaç kez kontrol ettim doğru mantıkla işliyolar gibi gözüküyor. Fakat bahsettiğim dizinin ilk bi kaç elemanını yazdırdığımda sırasıyla şu sonuçlar ortaya çıkıyor, 7,9,23 ve sonraki rakamalarda da yer yer yanlışlıl oluyor. Bu arada bu CIDR listesini bi text dökümanından kopyalayıp php sayfası üzerinde olan textarea özelliğiyle alıp $country_ip_range değişkenine ulaştırıyorum. Kodlarda hata bulamadım bende text dökümanının içini inceledim, şöyle bişey yaptım imleci text içeriğinin en başına getirdim, klavyedeki sağ ok tuşuyla tek tek atlamaya başladım, bütün karekterleri tek tuşlamayla atlıyorken boşlul karekterini 2 kez tuşlamayla atlıyor, txt dökümanındamı sorun var yoksa koddamı anlıyamadım. İlgili txt dökümanını http://www.ipaddresslocation.org/ip_ranges/get_ranges.php adresinden, alt tarafta bulunan country sekmesini turkey, output sekmesinide CIDR, seçerek elde edebilirsiniz. Yardımcı olursanız çok sevinirim. Teşekkürler.


$dot=0;
$reference_points=array();
$reference_points_index=1;

for($i=1;$i<=strlen(trim($country_ip_range));$i++){
if(substr(trim($country_ip_range),$i-1,1)=='.' && $dot<3){
$dot=$dot+1;

if($dot==3){
$reference_points[$reference_points_index]=$i;
$dot=0;
$reference_points_index=$reference_points_index+1;
}

}elseif(substr(trim($country_ip_range),$i-1,1)=='/'){
$reference_points[$reference_points_index]=$i;
$reference_points_index=$reference_points_index+1;

}elseif(substr(trim($country_ip_range),$i-1,1)=="&nbsp;"){
$reference_points[$reference_points_index]=$i;
$reference_points_index=$reference_points_index+1;
}
}
 
S

SDN Okuru

SDN Okuru
Sorunumu çözdüm ben bahsettiğim sorunlu kodla şunu yapmaya çalışıyordu. CIDR formatındaki bahsettiğim yerlerin kaçıncı karakter olduklarını tespit edip sonra trim substring vebenzerei fonksiyonlarla O sintringi 5 ayrı numaraya bölecektim yani şöyleyken 5.2.80.0/21 şöyle 5 2 80 0 21 olcaktı. Bunuda mysql veritabanına kayıt edip sayfaya giren kullanıcının ip adresini alıp veri tabanıyla karşılaştırınca hangi ülkeden olduğunu tespit etmeye çalışacaktım. Fakat preg_match_all fonksiyonu varmış bi arkadaş anlattı sağolsun. Gitim bi 4 saat felan preg fonksiyonlarına ve regex lere çalıştım. olayı çözmeme yardımcı olan kodda aşağıdaki gibi.

PHP:
<?php

$string = '5.2.80.0/21 5.11.128.0/17';

$pattern = '%(\d+)\.(\d+)\.(\d+)\.(\d+)/(\d+)%';
preg_match_all($pattern, $string, $matches, PREG_SET_ORDER);

var_dump($matches);

?>

ÇIKTI

Kod:
array (size=2)
  0 => 
    array (size=6)
      0 => string '5.2.80.0/21' (length=11)
      1 => string '5' (length=1)
      2 => string '2' (length=1)
      3 => string '80' (length=2)
      4 => string '0' (length=1)
      5 => string '21' (length=2)
  1 => 
    array (size=6)
      0 => string '5.11.128.0/17' (length=13)
      1 => string '5' (length=1)
      2 => string '11' (length=2)
      3 => string '128' (length=3)
      4 => string '0' (length=1)
      5 => string '17' (length=2)
 

mamanybono

Öğrenci
Katılım
15 Eylül 2012
Mesajlar
9
Reaksiyon puanı
0
Puanları
0
Sorunumu çözdüm ben bahsettiğim sorunlu kodla şunu yapmaya çalışıyordum. CIDR formatındaki bahsettiğim yerlerin kaçıncı karakter olduklarını tespit edip sonra trim substring vebenzerei fonksiyonlarla O sintringi 5 ayrı numaraya bölecektim yani şöyleyken 5.2.80.0/21 şöyle 5 2 80 0 21 olcaktı. Bunuda mysql veritabanına kayıt edip sayfaya giren kullanıcının ip adresini alıp veri tabanıyla karşılaştırınca hangi ülkeden olduğunu tespit etmeye çalışacaktım. Fakat preg_match_all fonksiyonu varmış bi arkadaş anlattı sağolsun. Gitim bi 4 saat felan preg fonksiyonlarına ve regex lere çalıştım. olayı çözmeme yardımcı olan kodda aşağıdaki gibi.

PHP:
<?php

$string = '5.2.80.0/21 5.11.128.0/17';

$pattern = '%(\d+)\.(\d+)\.(\d+)\.(\d+)/(\d+)%';
preg_match_all($pattern, $string, $matches, PREG_SET_ORDER);

var_dump($matches);

?>

ÇIKTI

Kod:
array (size=2)
  0 => 
    array (size=6)
      0 => string '5.2.80.0/21' (length=11)
      1 => string '5' (length=1)
      2 => string '2' (length=1)
      3 => string '80' (length=2)
      4 => string '0' (length=1)
      5 => string '21' (length=2)
  1 => 
    array (size=6)
      0 => string '5.11.128.0/17' (length=13)
      1 => string '5' (length=1)
      2 => string '11' (length=2)
      3 => string '128' (length=3)
      4 => string '0' (length=1)
      5 => string '17' (length=2)
 
Üst