Как регулярным выражением заменить везде кроме содержимого между тегами?

Добрый день, никак не могу додумать регулярное выражение, которое исключает из поиска содержимое между двумя тегами.

Существует некий файл с текстом, в котором нужно удалить лишние переносы строк кроме текста, который заключен в теги <text></text>.

<?
$content = '
String 1

String 2

<tag1>

Tag str 1

Tag str 2

</tag2>

<text>

Text

Text 2

Text 3


</text>

';
echo trim(preg_replace('/[\r\n]+/imu', "\n", $content));


В результате должно получиться:
String 1
String 2
<tag1>
Tag str 1
Tag str 2
</tag2>
<text>

Text

Text 2

Text 3


</text>


Как правильно добавить исключение замены переноса для содержимого между тегами text?
  • Вопрос задан
  • 606 просмотров
Пригласить эксперта
Ответы на вопрос 3
dimonchik2013
@dimonchik2013
non progredi est regredi
чоткие пацанчики делают это через DOM дерево

но ты можешь методом "разрезать - склеить":
читаешь,
тексттест заносишь в переменную $THE_TEXT,
в текст вместо нее - рандомстринг,
убираешь переносы в тексте,
заменяшь рандомстринг на значение переменной $THE_TEXT
записываешь

а играть в регекспы тебе рановато, но выражение есть, да
Ответ написан
Комментировать
@forspamonly2
если эти тэги text точно не бывают вложенными, то можно разделить строку на куски по этому тэгу (открывающему или закрывающему), потом в тех из кусков, которые не начинаются с открывающего тэга, заменить переносы строк, и склеить всё обратно.

сорри, пыха нет под рукой, на жабаскрипте это будет примерно так:
content.split(/(?=<\/?text>)/).map(p => p.match(/^<text>/) ? p : p.replace(/\n\n/g, "\n")).join('')
Ответ написан
Комментировать
@dodo512
echo preg_replace('~(\n)[\r\n]+|(<text>.*?</text>)~isu', '$1$2', $content);

https://regex101.com/r/XXttRc/1

echo preg_replace('~[\r\n]+|<text>.*?</text>(*SKIP)(*F)~isu', "\n", $content);

https://regex101.com/r/XXttRc/2
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы