سؤال

أريد أن أعرف هل هناك أي طريقة لتقسيم النص مثل هذا:

123456789 إلى 123-456-789

لإضافة "-" بعد كل 3 أحرف؟

أردت فقط أن أعرف، لأنني أعرف العكس، ولكن كيفية القيام بذلك هو فوق رأسي.;)

وأيضا إذا كان النص

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

languge : PHP only
هل كانت مفيدة؟

المحلول

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

http://php.net/wordwrap

نصائح أخرى

وأنا لست مروحة كبيرة من regexes لاستخراج سلسلة بسيط (الاستخراج طول خصوصا الثابتة)، مفضلا لهم للأشياء قليلا أكثر تعقيدا. تقريبا كل لغة لها وظيفة فرعية لذلك، على افتراض المدخلات الخاصة بك قد تم التحقق من صحتها، بسيطة (الزائفة رمز لأنك لم تحدد اللغة):

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

إذا كنت ترغب في ذلك كل ثلاثة أحرف لسلسلة طول متغير (مع حجم الغريب في النهاية):

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

لأي لغة:

  • قم بإنشاء متغير سلسلة فارغ يسمى "النتيجة"
  • قم بإنشاء متغير عداد صحيح، "i"، والذي يزيد حتى طول الملف إبداعي السلسلة (واحدة مع الرقم)
  • إلحاق كل حرف من السلسلة الأصلية بـ "النتيجة"
  • إذا كانت قيمة i modulo 3 (عادةً % أو mod) تساوي صفرًا، فقم بإلحاق شرطة بـ "النتيجة"

في مصلحة اكتمالها، وهنا هو الحل بيثون:

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

ومنذ لكم تحديث سؤالك لتحديد الحل PHP، وهذا ينبغي العمل:

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

substr للحصول على مزيد من المعلومات حول هذه الوظيفة. وهذا العمل ليس فقط بالنسبة للأرقام، ولكن لالأحرف الأبجدية للغاية.

ولكن نسخة بايثون آخر:

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

وأعتقد أن هذا يمكن القيام به عاقل في التعابير المنطقية مع lookahead:

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

وبما أنك ذكرت PHP في تعليق:

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

تحرير : بعد أظهرت VolkerK wordwrap، وجدت chunk-split في وثائق:

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

وهذا له ميزة أنه يعمل أيضا عندما تكون هناك مسافات في سلسلة (أن رجوع الى السطر يفضلون لكسر في المسافات).

في بيرل:

#!/usr/bin/perl

use strict;
use warnings;

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

print "$1-$2-$3"

ويمكنك أن تفعل ذلك مع (ضمن وسائل أخرى) مباراة التعبير العادية واستبدال. بناء الجملة الصحيح يعتمد على لغة البرمجة أداة أو تستخدمه. على سبيل المثال، طريقة واحدة للقيام بذلك في بيرل سيكون

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

والخط 2 يستبدل كل 3 أرقام لنفس 3 أرقام واندفاعة. مع ختم () لحذف شرطة زائدة.

وهناك سؤال آخر هنا. ماذا تفعل عندما لا يحتوي على سلسلة من مضاعفات بنسبة 3 كمية من الأرقام؟ إذا سمح هذه السلاسل، ثم المقتطف أعلاه سيحتاج التعديل.

وأيضا، اعتمادا على تفاصيل القضية، قد تحصل بعيدا مع استبدال فرعية بسيطة، أو تشريح السلسلة.

واحد أكثر بيرل سبيل المثال. هذا لا إزالة مجموعات النهائية أصغر من ثلاثة، وأنه يترك مجموعة أولية من أقل من ثلاثة أرقام وحدها. أنها تقوم (جميلة بلا خجل) على "أرقام المال" مثلا في تعلم بيرل

#!/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";
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top