2012-03-31 3 views
1

Я пробовал несколько функций, чтобы извлечь что-либо между двумя строками. В разделителях могут быть специальные символы, я думаю, именно поэтому никто не работал для меня.Самый надежный способ извлечения строк между двумя разделителями

Моя текущая функция:

function between($str, $startTag, $endTag){ 
    $delimiter = '#'; 
    $regex = $delimiter . preg_quote($startTag, $delimiter) 
         . '(.*?)' 
         . preg_quote($endTag, $delimiter) 
         . $delimiter 
         . 's'; 
    preg_match($regex, $str, $matches); 
    return $matches; 
} 

Пример строки:

#{[email protected]}# 
Text i want 
#{END}# 

#{[email protected]}# 
Second text i want 
#{END}# 

Как улучшить то или предложить другое решение:

  • Поддержка любого рода характера или новых линий
  • Извлечь несколько строк, если найдено

Текущее Поведение: возвращает только первый матч, а также возвращает матч плюс окружающие теги, который является нежелательным

ответ

6

Используйте m вариант для многострочных регулярных выражений (это позволяет . характер, чтобы соответствовать новой строки):

preg_match('/foo.+bar/m', $str); 
//     ^--- this 

Используйте preg_match_all(), чтобы получить свои несколько строк:

preg_match_all($regex, $str, $matches); 
return $matches[1]; // an array of the strings 

Edit:

Причина, по которой ваш текущий код возвращает совпадение плюс t он окружает теги, потому что вы используете return $matches. В массиве $matches есть несколько элементов. Индекс 0 - это всегда целая строка, которая соответствует выражению. Индексы 1 и выше - ваши группы захвата. В вашем выражении у вас была только одна группа захвата («строка»), поэтому вы хотели бы делать только return $matches[1] вместо return $matches.

0

Вы можете использовать preg_match_all для извлечения нескольких строк, кроме того, что ваш код кажется достаточно простым, обычно проще, быстрее.

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