Yarma metin

9 Cevap php

Böyle metni bölmek için herhangi bir yolu var olduğunu bilmek istiyorum:

123-456-789 içine 123456789

eklemek gibi "-" Her 3 karakterden sonra?

Sadece ben tersini biliyorum, bilmek istedim, ama nasıl bu kafamda bitti. ;)

ve aynı zamanda metin ise,

ABCDEFGHI OR A1B2C3D4E or any other format 
without any space between the characters !

languge : PHP only

9 Cevap

<?php
$i = '123456789';
echo 'result: ', wordwrap($i, 3, '-', true);
prints
result: 123-456-789

bkz http://php.net/wordwrap

Ben biraz daha karmaşık şeyler için onları tercih, basit dize ekstraksiyon (özellikle sabit uzunluk ekstraksiyon) için regexes büyük bir hayranı değilim. Hemen hemen her dil bir alt işlevi vardır bu yüzden, (Bir dil belirtilmeyen beri sözde-kod) Giriş zaten, basit bir valide edilmiştir küstah:

s = substring (s,0,3) + "-" + substring (s,3,3) + "-" + substring (s,6,3)

Bunu (sonunda tek boyutu ile) bir değişken uzunlukta bir dize için her üç karakteri isterseniz:

t = ""
sep = ""
while s != "":
    if s.len <= 3:
        t = t + sep + s
        s = ""
    else:
        t = t + sep + substring (s,0,3)
        s = substring (s,3)
    sep = "-"
s = t

Herhangi bir dil için:

  • "Sonuç" adında boş bir dize değişkeni oluşturun
  • original dize uzunluğu kadar artıran bir tamsayı sayaç değişkeni, "i", (sayı ile bir) oluşturma
  • "Sonuç" için özgün dize her karakter eklemek
  • I 3 (genellikle% veya mod) sıfır modulo varsa, "sonuç" bir çizgi eklemek

Bütünlüğü ilgi olarak, burada Python bir çözümdür:

>>> a = "123456789"
>>> a[0:3] + "-" + a[3:6] + "-" + a[6:9]
'123-456-789'

Eğer bir PHP çözüm belirtmek için soru güncellenen bu yana, bu çalışması gerekir:

substr($a, 0, 3) . "-" . substr($a, 3, 3) . "-" . substr($a, 6, 3)

substr Bu fonksiyonla ilgili daha fazla bilgi için bkz. Bu basamak için, ama çok alfabetik karakterler için değil sadece çalışacak.

Henüz başka bir Python sürümü:

>>> x="123456789"
>>> out=[x[i:i+3] for i in xrange(0, len(x), 3)]
>>> print "-".join(out)
123-456-789

Ben bu sanely LookAhead ile bir regex yapılabilir olduğunu düşünüyorum:

s/(.{3})(?=.)/$1-/g

Eğer bir yorumda PHP belirtilen beri:

preg_replace ("/(.{3})(?=.)/", "$1-", $string);

edit: VolkerK gösterdi sonra wordwrap, ben belgelerinde chunk-split bulundu:

$new_string = chunk_split ($string, 3, '-');

Bu dize boşluk olduğunda da (wordwrap mekânlarda kırmak için tercih ediyorum) çalışan bir avantaja sahiptir.

Perl:

#!/usr/bin/perl

use strict;
use warnings;

my $string = "123456789";
$string =~ /(\d{3})(\d{3})(\d+)/;

print "$1-$2-$3"

(Diğer araçlarla arasında) ile bir düzenli ifade maç yapmak ve değiştirebilirsiniz. Tam sözdizimi kullandığınız araç veya programlama diline bağlıdır. Örneğin, Perl bunu yapmak için tek yol olacaktır

$a = "123456789";
$a =~ s/(\d{3})/$1-/g;
chop($a);
print $a;

Satır 2 aynı 3 basamak ve bir çizgi boyunca her 3 basamak değiştirir. Pirzola () ile biz sondaki çizgi silin.

Burada başka bir soru var. Dize basamak 3 miktarına göre bir katını içermiyorsa ne yapmalı? Böyle dizeleri izin verildi, sonra yukarıdaki pasajı değişiklik gerekir.

Ayrıca, davanın özelliklerine bağlı olarak, basit substring değiştirme, veya dize dilimleme kaçabilirsiniz.

Bir daha Perl örnek. Bu üç daha küçük son grupları kaldırmaz, ve tek başına en az üç basamaktan ilk gruplarını bırakır. Bu Learning Perl (5.basım sayfa 212) yılında "numaraları para" örnek üzerinde (oldukça utanmadan) dayanıyor:

#!/usr/bin/env perl
use strict;
use warnings;

print "Gimme' a number: ";
chomp(my $number = <STDIN>);

1 while ($number =~ s/([0-9]{3})([0-9]+)/$1-$2/);

print "Now it's $number\n";