Замена всех экземпляров новой строки не внутри тегов

У меня есть текст с символами новой строки, и я хотел бы заменить все экземпляры новой строки, которые не находятся внутри определенных тегов, на <br />s. Теги [something][~something], где something может быть что угодно.

Извините, что не включил то, что я уже пробовал, но я понятия не имею, как заставить регулярное выражение соответствовать чему-то не внутри чего-то другого. Это вообще возможно?


person Seth Carnegie    schedule 13.06.2011    source источник
comment
Было бы полезно, если бы вы разместили образец html, который вы пытаетесь заменить.   -  person Pedro Lobito    schedule 16.08.2011


Ответы (1)


Помня, что вы не должны анализировать XML/HTML с помощью регулярных выражений, и это пример этого:

#!/usr/bin/perl
#

$in = "foo\nbar\nbaz[something]else\nis\n[~something]\nHappening\n[something]else\nis\n[~something]here\n";
$out = "";

while ($in =~ s/^(.*?)(\[something\].*?\[~something\])//s)
{
  my($before,$during) = ($1,$2);
  $before =~ s/\n/<br \/>/g;
  $out .= $before.$during;
}
$in =~ s/\n/<br \/>/g;
$out .= $in;
print $out;

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

person Seth Robertson    schedule 13.06.2011
comment
совершенно бесполезно публиковать perl здесь для php - person dynamic; 13.06.2011
comment
На самом деле Perl — мой любимый язык, но я вынужден использовать PHP. И спасибо, работает как шарм, надеюсь, я смогу портировать его на PHP и все такое. - person Seth Carnegie; 13.06.2011
comment
Публиковать perl здесь не совсем бесполезно. Пользователь задавал вопрос на основе регулярных выражений, а preg_match реализует Perl-совместимые регулярные выражения (PCRE). PHP во многом похож на Perl. - person Michael Papile; 13.06.2011