PHP ile bir CSV telefon numaralarını düzeltmek için regex kullanarak

2 Cevap php

Kendi alan kodu gelen çağrıyı eşleşen sürece benim yeni telefon bir telefon numarasını tanımıyor. Ben bir alan kodu-devlet aramalar için gerekli değildir Idaho yaşamak beri, benim temasların çok bir alan kodu olmadan kaydedildi. Benim telefonda saklanan kişileri binlerce yana, elle güncellemek için pratik olmazdı. Ben sorunu işlemek için aşağıdaki PHP komut dosyası yazmaya karar verdim. Ben rastgele temasların başında yinelenen alan kodları bulma kulüpler dışında, iyi iş gibi görünüyor.

 <?php
//the script can take a while to complete
set_time_limit(200);

function validate_area_code($number) {
    //digits are taken one by one out of $number, and insert in to $numString
    $numString = "";
    for ($i = 0; $i < strlen($number); $i++) {
        $curr = substr($number,$i,1);
        //only copy from $number to $numString when the character is numeric
        if (is_numeric($curr)) {
            $numString = $numString . $curr;
        }
    }
    //add area code "208" to the beginning of any phone number of length 7
    if (strlen($numString) == 7) {
        return "208" . $numString;
    //remove country code (none of the contacts are outside the U.S.)
    } else if (strlen($numString) == 11) {
        return preg_replace("/^1/","",$numString);
    } else {
        return $numString;
    }
}
//matches any phone number in the csv
$pattern = "/((1? ?\(?[2-9]\d\d\)? *)? ?\d\d\d-?\d\d\d\d)/";
$csv = file_get_contents("contacts2.CSV");
preg_match_all($pattern,$csv,$matches);


foreach ($matches[0] as $key1 => $value) {
    /*create a pattern that matches the specific phone number by adding slashes before possible special characters*/
    $pattern = preg_replace("/\(|\)|\-/","\\\\$0",$value);

    //create the replacement phone number
    $replacement = validate_area_code($value);

    //add delimeters 
    $pattern = "/" . $pattern . "/";

    $csv = preg_replace($pattern,$replacement,$csv);
}
echo $csv;

?>

CSV değiştirerek daha iyi bir yaklaşım var mı? Ayrıca, CSV üzerinde geçiş sayısını en aza indirmek için bir yol var? Yukarıdaki komut olarak, preg_replace çok büyük bir String üzerinde binlerce kez denir.

2 Cevap

Biraz daha benim kendi kazma benim soru regex sorunları ortaya çıkardı. Sorun csv yinelenen kişiler ile.

Example: (208) 555-5555, 555-5555

Ilk geçiş olur sonra:

2085555555, 208555555

and After the second pass becomes 2082085555555, 2082085555555

Ben yedek regex değiştirerek bu çalıştı:

//add escapes for special characters
$pattern = preg_replace("/\(|\)|\-|\./","\\\\$0",$value);
//add delimiters, and optional area code
$pattern = "/(\(?[0-9]{3}\)?)? ?" . $pattern . "/";

Ben doğru anlamak, sadece doğru, her yerde bu dosyada herhangi bir 7 haneli telefon numarası alan kodu prepend gerekir? Ben sende sisteminin ne tür hiçbir fikrim yok, ama bazı iyi araçları varsa, burada bir kaç seçenek vardır. Ve tabii ki, aldıkları yaklaşımlar muhtemelen PHP uygulanabilir; bu sadece benim dillerden biri değil.

Peki, nasıl bir sed tek-liner hakkında? Sadece iki sol çizgi veya virgül başında ve virgül veya sağda satırın sonuna tarafından sınırlanan 7 haneli telefon numaraları, için bak.

sed -r 's/(^|,)([0-9]{3}-[0-9]{4})(,|$)/\1208-\2\3/g' contacts.csv

Eğer sadece belirli alanlarda uygulamak istiyorsanız Veya, Perl (ya da awk) daha kolay olurdu. Bu ikinci alan olduğunu varsayalım:

perl -F, -ane '$"=","; $F[1]=~s/^[0-9]{3}-[0-9]{4}$/208-$&/; print "@F";' contacts.csv

-F, alan ayırıcı, $" çıkış alan ayırıcı (evet, o oh iyi, bir kez döngü başına atanır) olduğu, diziler bu yüzden ikinci bir alan sıfır endeksli gösterir $F[1], orada bir run-of-the-mill ikame, ve sen sonuçlarını yazdırabilirsiniz.