2012-01-11 2 views
2

Мне нужно разбить следующую строку и поместить каждую новую строку в новый элемент массива.Превращение многострочной строки в многоэлементный массив с использованием регулярных выражений в PHP

this is line a.(EOL chars = '\r\n' or '\n') 
(EOL chars) 
this is line b.(EOL chars) 
this is line c.(EOL chars) 
this is the last line d.(OPTIONAL EOL chars) 

(Обратите внимание, что последняя строка не может иметь каких-либо EOL символов присутствует строка также иногда содержит только 1 строку, которая по определению является последним.).

Следующие правила должны быть соблюдены:

  • Пустые строки (как и вторая строка) должны быть отброшены и не помещены в массив.
  • Элементы EOL не должны включаться, потому что в противном случае мои сравнения строк терпят неудачу.

Таким образом, это должно привести к следующему массиву:

[0] => "this is line a." 
[1] => "this is line b." 
[2] => "this is line c." 
[3] => "this is the last line d." 

Я попытался сделать следующее:

$matches = array(); 
preg_match_all('/^(.*)$/m', $str, $matches); 
return $matches[1]; 

$ матчей [1] действительно содержит каждую новую строку, но:

  • Пустые линии включены также
  • Кажется, что символ «\ r» получает контрабанду в любом случае в конце строк в массиве. Я подозреваю, что это имеет какое-то отношение к диапазону регулярных выражений '.' который включает все, кроме '\ n'.

Во всяком случае, я играл с '\ R' и еще много чего, но я просто не могу найти хороший шаблон регулярного выражения, который следует за двумя правилами, изложенными выше. Любая помощь, пожалуйста?

+0

Вы можете просто передать '$ matches' через' array_filter() '(' $ матчи = array_filter ($ матчи); '), чтобы избавиться от пустых элементов. – Tadeck

+0

Соединив все ваши ответы ниже, я нашел preg_split ('/ \ R /', trim ($ str)); работать!!! – x74x61

ответ

5

Просто используйте preg_split() разделить на регулярное выражение:

// Split on \n, \r is optional.. 
// The last element won't need an EOL. 
$array = preg_split("/\r?\n/", $string); 

Обратите внимание, что вы также можете использовать trim($string), если есть конечная новая строка, поэтому вы не получите лишний элемент массива.

+0

Спасибо за наконечник. Теперь я использую preg_split ('/ \ R /', trim ($ str)); который работает. – x74x61

+0

preg_split ('/ \ R + /', trim ($ str)) еще лучше! пустые строки не включаются благодаря + – x74x61

1

Я думаю, что preg_split - это путь ... Вы можете использовать соответствующее регулярное выражение для использования любого символа EOL в качестве разделителя.

Что-то вроде следующего (регулярное выражение должно быть немного более сложным):

$array = preg_split('/[\n\r]+/', $string); 

Надежда, что помогает,

1

Использование preg_split функции:

$array = preg_split('/[\r\n]+/', $string); 
3

Существует функция только для этого - file()

+0

Это строка, а не файл, который мне нужен. – x74x61

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