preg_match ile bazı karekter sonra dize bölmek

4 Cevap php

Ben bir sonraki en yakın kelime-kopma kırmak sonra, en fazla 300 karakterden az maç olacak bu kodu bulundu:

 $var = 'This is a test text 1234567890 test check12.' # 44 chars
 preg_match('/^.{0,300}(?:.*?)\b/iu', $var, $matches);
 echo $matches[0];

44 300'den daha düşük olduğu, bu yüzden çıkış gibi aynı $ var olmasını bekliyoruz.

Ama çıkış:

 This is a test text 1234567890 test check12   # 43 chars

$ Karşılaşmalar [0] ancak $ var yok, bana sonunda nokta vermiyor. Herkes nasıl (nokta ile) tam bir dize almak için bana söyleyebilir?

4 Cevap

Ben tarafından beklenen sonuç alabilir:

  • Çıkarma \b
  • \b $ ile değiştirilmesi

EDIT:

Deseninizdeki dizenin sonunda nokta bir kelime sınırından gibi davranan, bu yüzden nokta önce her şeyi maç edebiliyoruz. Eğer sonra .* koyarsanız \b, bunu nokta maç görürsünüz.

this regex çalışmaları nasıl kelime sınırları hakkında daha fazla bilgi için bkz.

300 karakter de kırmak için preg_match kullanarak kötü bir fikir gibi görünüyor. Neden sadece kullanmayın:

substr($var, 0, strpos($var, ' ', 300));

Bu size düzenli ifadeler kullanmadan sonraki boşluklarla kırık ilk 300 karakter verecektir.

'/^.{300}(?:.*?)\b|^.*{0,300}/u'

Ben bu olsa istediğiniz neden emin değilim. Here benzer bir soruya benim cevabım, ancak önceki yakın boşlukta kesme.

Cebinize

(:. *?)

Sen bence * kurtulmak gerekir. Bu kadar sonsuz kez en az bir kez aynı, ama gerektiği anlamına gelir. Yani dönem ikinci maçında olduğunu bulmak wil.

Dürüst olmak gerekirse, ben sadece desen kullanmak istiyorsunuz

 preg_match('/^(.){0,300}\b/iu', $var, $matches);