Dize Yarma zaman ayraclar saklayın

3 Cevap php

Edit: OK, I can't read, thanks to Col. Shrapnel for the help. If anyone comes here looking for the same thing to be answered... print_r(preg_split('/([\!|\?|\.|\!\?])/', $string, null, PREG_SPLIT_DELIM_CAPTURE));

Sınırlayıcı bir dizi üzerinde bir dize bölmek ve bölünmüş sonra sınırlayıcı konumunu ve karakter (ler) korumak için herhangi bir yolu var mı?

Örneğin, bir sınırlayıcı ile ! ? . !?, bu dönme:

$string = 'Hello. A question? How strange! Maybe even surreal!? Who knows.';

Bu içine

array('Hello', '.', 'A question', '?', 'How strange', '!', 'Maybe even surreal', '!?', 'Who knows', '.');

Şu anda print_r(preg_split('/([\!|\?|\.|\!\?])/', $string));, bir alt modeli olarak sınırlayıcı yakalamak için kullanmaya çalışıyorum, ama çok şans sahip değilim.

3 Cevap

Eğer ilgili bayrağını buldum gibi Yorumun geliyor, ama regex biraz kapalı oldu, bu yüzden ben yine de bu eklemek için gidiyorum:

preg_split('/(!\?|[!?.])/', $string, null, PREG_SPLIT_DELIM_CAPTURE);

Bu ilk sonra her dizenin başında boşluk bırakacak, bu nedenle muhtemelen de trim() ile hepsini çalıştırmak isteyeceksiniz unutmayın.

Sonuçlar:

$string = 'Hello. A question? How strange! Maybe even surreal!? Who knows.';
print_r(preg_split('/(!\?|[!?.])/', $string, null, PREG_SPLIT_DELIM_CAPTURE));

Array
(
    [0] => Hello
    [1] => .
    [2] =>  A question
    [3] => ?
    [4] =>  How strange
    [5] => !
    [6] =>  Maybe even surreal
    [7] => !?
    [8] =>  Who knows
    [9] => .
    [10] => 
)

Basitçe preg_split işlevi PREG_SPLIT_DELIM_CAPTURE ekleyin:

$str = 'Hello. A question? How strange!';
$var = preg_split('/([!?.])/', $str, 0, PREG_SPLIT_DELIM_CAPTURE);
$var = array(
    0 => "Hello",
    1 => ".",
    2 => " A question",
    3 => "?",
    4 => " How strange",
    5 => "!",
    6 => "",
);

Ayrıca ., !, ? veya !? sonra alana ayırabilirsiniz. Bir uzay böyle bir karakterden sonra olduğunu garanti Ama eğer bu sadece kullanılabilir.

(<=\.|!?|?|!): Bu regex kılan bir eşleştirerek ama olumlu bir görünüm arka, bunu yapabilirsiniz

'/(?<=\.|\?|!) /'

Ve sonra, dizeleri !? ile biter uyumlu olup olmadığını kontrol etmek gerekir: eğer öyleyse, son iki substrine. Değil ise, son karakteri substrine gerekecek.