2017-07-12 2 views
1

J'ai cette chaîne: 000 003, qui peut augmenter dès que d'autres commentaires sont publiés. Après 300 commentaires, cette chaîne ressemblera à ceci: 000 303. Après 1 000 commentaires, 001 303 et ainsi de suite. J'utilise chunk_split() pour ajouter l'espace après les 3 premiers zéros.Remplacer les zéros à gauche par un élément d'étendue

Je veux remplacer les zéros de tête par <span class="color-gray">the zeros here</span> mais je ne peux pas le réparer. Voici comment la fonction ressemble à l'heure actuelle:

function format_id($string) { 
    if($string < 10) { 
     $test = chunk_split('00000'.$string, 3, ' '); 

    } elseif($string > 10 AND $string < 100) { 
     $test = chunk_split('0000'.$string, 3, ' '); 

    } elseif($string > 100 AND $string < 1000) { 
     $test = chunk_split('000'.$string, 3, ' '); 

    } elseif($string > 1000 AND $string < 10000) { 
     $test = chunk_split('00'.$string, 3, ' '); 

    } elseif($string > 10000 AND $string < 100000) { 
     $test = chunk_split('0'.$string, 3, ' '); 

    } else { 
     $test = chunk_split($string, 3, ' '); 
    } 

    return preg_replace('/^0/', '$1', $test); 
} 

format_id(35) retours 00 003. Je veux que ça ressemble à ceci en HTML: <span class="color-gray-light">000 00</span>3. Seuls les zéros (comme je l'ai dit) seront dans l'élément span.

Comment puis-je résoudre ce problème?

+0

Pourquoi ne pas supprimer les espaces avec [str_replace] (http://php.net/manual/en/function.str-replace.php), puis l'utilisateur [number_format] (http: // php .net/manual/fr/function.number-format.php) ou/et [sprintf] (http://php.net/manual/fr/function.sprintf.php)? – Peon

+0

Je suppose que vous voulez dire pourquoi dire pourquoi je ne montre pas les chiffres comme ceci: 1 403 434 et ainsi de suite. Parce que je veux que ce soit comme je l'ai montré dans ma question :) – Erik

+0

https://stackoverflow.com/questions/1699958/formatting-a-number-with-leading-zeros-in-php? – Peon

Répondre

2
return preg_replace(
    '/^([\s0]+)/', 
    '<span class="color-gray-light">$1</span>', 
    $test 
); 

Cela va envelopper les zéros (et les espaces) dans l'intervalle dont vous avez besoin.

+0

Cela a fait l'affaire! Merci beaucoup! J'accepterai votre réponse dès que possible :) – Erik

0

Cela devrait faire l'affaire:

function format_id($string) { 
    return preg_replace('/^([\s0]+)/', '<span class="color-gray-light">$1</span>', $string); 
} 
1

est ici une alternative qui n'utilise pas regex:

function format_str($number, $maxLen){ 
    $len  = strlen($number); 
    $padding = $maxLen - $len; 
    if($padding > 0){ 
     return "<span>".str_pad ('' , $padding, '0', STR_PAD_LEFT)."</span>".$number; 
    } 

    return $number; 
} 

Voir ici: https://3v4l.org/fJHXW

De toute évidence, cela ne traite pas valeurs flottantes. Mais je suppose que vous ne l'utilisez qu'avec des entiers.

Sortie:

echo format_str(1,6); 
// <span>00000</span>1 
echo format_str(10,6); 
// <span>0000</span>10 
echo format_str(152,6); 
// <span>000</span>152 
echo format_str(32152,6); 
// <span>0</span>32152 
1

J'ai réécrites votre fonction d'être un peu plus simple et plus souple (j'espère que votre site peut se développer d'avoir un contenu au-delà de 6 chiffres!). Flosculus a la réponse à votre question (et je l'ai inclus dans cette fonction); c'est juste pour adresser votre fonction elle-même.

<?php 
function format_id ($string, $zero_padding) { 
    // Add the padding 
    $string = str_pad($string, $zero_padding, '0', STR_PAD_LEFT); 

    // Now split the string to have space every 3 chars 
    $string = chunk_split($string, 3, ' '); 

    // Finally, add the span. Credit goes to Flosculus' answer for this! 
    return preg_replace(
     '/^([\s0]+)/', 
     '<span class="color-gray-light">$1</span>', 
     $string 
    ); 
} 

print format_id("3", 9); 
?>