2009-06-23 4 views
1

Я пытаюсь использовать split()()() preg_split() также является опцией, если ваш ответ работает с ним), чтобы разделить строку на 2 или более \r\n. Мое текущее усилие:Регулярное выражение с несколькими символами новой строки в последовательности

split("(\r\n){2,}",$nb); 

Проблемы с этим он соответствует каждый раз, когда есть 2 или 3 \r\n «s, затем идет дальше и находит следующую. Это неэффективно с 4 или более \r\n.

Мне нужно, чтобы все экземпляры двух или более \r\n обрабатывались так же, как два \r\n. Например, мне нужен

Hello\r\n\r\nMy\r\n\r\n\r\n\r\n\r\n\r\nName is\r\nShadow 

стать

array('Hello','My','Name is\r\nShadow'); 

ответ

0

Добавление флага PREG_SPLIT_NO_EMPTY к preg_replace() с рисунком Томалака "/(\\r\\n){2,}/" выполнил это для меня.

2

preg_split()должен сделать это с

$pattern = "/(\\r\\n){2,}/"; 
+1

Да, потому что pcre работает «жадно» по умолчанию. I.e. {2,} пытается сопоставить как можно больше символов, в то время как split() остановит сопоставление шаблонов, как только оно будет выполнено. – chendral

+0

Он не делал этого только с этим, но я нашел флаг PREG_SPLIT_NO_EMPTY, который выполняет то же самое для моих целей. –

+0

@chendral: Хм ... @ Ответ Гумбо, похоже, указывает на другое. – Tomalak

1

Что о следующем предложении:

$ нб = implode ("\ r \ n", array_filter (explode ("\ r \ n", $ nb)));

1

Это работает для меня:

$nb = "Hello\r\n\r\nMy\r\n\r\n\r\n\r\n\r\n\r\nName is\r\nShadow"; 
$parts = split("(\r\n){2,}",$nb); 
var_dump($parts); 
var_dump($parts === array('Hello','My',"Name is\r\nShadow")); 

Печать:

array(3) { 
    [0]=> 
    string(5) "Hello" 
    [1]=> 
    string(2) "My" 
    [2]=> 
    string(15) "Name is 
Shadow" 
} 
bool(true) 

Обратите внимание на double quotes во втором тесте, чтобы персонажи представлены \r\n.

Смежные вопросы