2016-04-25 6 views
0

Iv sehen einige Antworten auf links wie: Add space after every 4th characterFügen Sie einen Raum an einer Schnur aber Zählen rechts

echo wordwrap('1234567890' , 4 , '-' , true) 

verwenden, aber in diesem Fall muss ich von rechts die Zeichen zählen nach links.

Zum Beispiel, um eine Telefonnummer benutzerfreundlich 123-123-1234 zu formatieren. Das Problem ist, dass der Benutzer manchmal einen Codebereich einreichen kann, und wenn ich normal von links nach rechts beginne, kann ich folgendes bekommen: 012-312-3123-4 Also denke ich von rechts nach links zu beginnen.

Irgendwelche Ideen?

+0

einen regulären Ausdruck mit einem optionalen Spiel Verwenden Sie am Anfang, und verankern es am Ende. – Barmar

Antwort

1

Ein Regex mit einem Lookahead assertion, dass es eine oder mehrere Gruppen von 4 Zeichen zwischen der übereinstimmenden Position und dem Ende der Zeichenfolge gibt, sollte dies für Sie tun.

echo preg_replace("/(?=(.{4})+$)/", "-", "1234567890"); 
// 12-3456-7890 

Sie müssen Strings mit einem genauen Vielfachen von 4 Zeichen verarbeiten, die am Anfang mit einem Bindestrich enden. Sie könnten der Regex entweder eine Lookbehind-Assertion hinzufügen oder sie wäre leichter zu lesen, wenn Sie den Bindestrich danach abschneiden.

echo preg_replace("/(?=(.{4})+$)/", "-", "123456789012"); 
// -1234-5678-9012 
echo preg_replace("/(?<=.)(?=(.{4})+$)/", "-", "123456789012"); 
// 1234-5678-9012 
echo ltrim(preg_replace("/(?=(.{4})+$)/", "-", "123456789012"), "-"); 
// 1234-5678-9012 
+0

Ich habe aus dem Lesen Ihrer Frage wieder erkannt, dass, obwohl es sagt, dass Sie ein Leerzeichen nach jedem vierten Zeichen von rechts nach links zählen möchten, Ihr Beispiel ** 123-123-1234 ** dies nicht tut. Lassen Sie mich wissen (und bearbeiten Sie die Frage), wenn ich die Anforderungen missverstanden habe. –

+0

Lassen Sie mich die Optionen testen und ich werde die Ergebnisse melden. Ich könnte ein Leerzeichen oder einen Charakter verwenden. : o) – Rafael

+0

Hum. Jetzt, da ich Ihre Lösung ausprobiert und damit gespielt habe, versuche ich, Konstruktoren zu gruppieren. Zum Beispiel "preg_replace ("/(? = (. {3}) (. {4}) + $)/"," - "," 123456789012 ")" um die Abstände zu erkunden. Soll ich die Frage bearbeiten oder eine neue schreiben? – Rafael

1

Dies funktioniert

function myFormat($s, $len, $delimiter = "-") 
{ 
    $techChar = " "; 
    $newLen = ceil(strlen($s)/$len) * $len; 

    $s = str_pad($s, $newLen, $techChar, STR_PAD_LEFT); 
    $s = wordwrap($s, $len, $delimiter, true); 
    $s = ltrim($s, $techChar); 

    return $s; 
} 
+0

Lassen Sie mich einen Blick darauf werfen und einige Tests machen, Danke: o) – Rafael

Verwandte Themen