2016-10-04 2 views
1

Я пытаюсь инкапсулировать лимерик (абзац с экранированными окончаниями строк/разрывами одной строки) внутри некоторых абзацев файла уценки.regex для инкапсулирования абзаца внутри файла отметки

Пример:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 

Sed maximus ut dui non malesuada. Duis ultrices erat quis velit rutrum, a elementum lectus dictum. 

There was a young lady named Bright\ 
who traveled much faster than light.\ 
She set out one day\ 
in a relative way,\ 
and came back the previous night. 

Nulla in dapibus erat. Integer sed cursus nunc. 

Quisque quis neque orci. Aliquam in leo consectetur, molestie massa quis, pretium nulla. 

Теперь, как я могу добиться этого:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 

Sed maximus ut dui non malesuada. Duis ultrices erat quis velit rutrum, a elementum lectus dictum. 

<tag>There was a young lady named Bright\ 
who traveled much faster than light.\ 
She set out one day\ 
in a relative way,\ 
and came back the previous night.</tag> 

Nulla in dapibus erat. Integer sed cursus nunc. 

Quisque quis neque orci. Aliquam in leo consectetur, molestie massa quis, pretium nulla. 

я был в состоянии поймать конец Лимерик пункта. Но проклятое регулярное выражение слишком жадно, когда я использую/m и s/модификаторы.

Я попытался

[^\n]^$.+?\\ 

^$[^\n].+?\\ 

^$[^\n].+?\\ 

^$.^.+?\\.+?[^\\]$ 

Это действительно сводит меня с ума.

+1

Интересно, почему вы использовали '^ $' вообще - он может соответствовать пустой строке/строке. Что делать, если лимитер начинается в начале всей строки? Если вам действительно нужно проверить, что предыдущая строка пуста, вы можете использовать отрицательный lookbehind как '(?

+0

Спасибо за подсказку. Я буду иметь ввиду. Но материал, который я собираюсь проанализировать, - это сгенерированная машиной уценка - так, да, всегда должна быть пустая строка перед лимерикой. – Juergen

ответ

1

кажется, что вы пытаетесь соответствовать последовательных линий что конец с \ кроме последней строки.

Вы можете использовать

preg_replace('/^.+\\\\(?:\R.+\\\\)*\R.*/m', '<tag>$0</tag>', $txt) 

См this regex demo.

Детали:

  • ^ - начало линии
  • .+ - 1 или более символов, кроме LineBreak символов как можно больше
  • \\ - буквального \
  • (?:\R.+\\)* - 0 или более последовательностей:
    • \R - LINEBREAK
    • а
    • .+ - любые 1+ кроме LineBreak символов
    • \\ символы - буквальный \
  • \R.* - это перевод строки (\R) и любые 0+, кроме LineBreak символов символы (до конца строки).
+0

Также см. Демоверсию [** PHP в IDEONE **] (https://ideone.com/LFpV8E). –

+0

Ты мой герой. – Juergen

+0

Думаю, это сработало для вас. Пожалуйста, подумайте о принятии ответа. –

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