Реально ли составить регулярку, чтобы в тексте все \n заменялись на <br>, но только не внутри тега HTML: ? У меня в новостях реализован автоматический перенос строки, а недавно я стал использовать бб-тег HTML: и внутри него проявляются косяки - например, весь html-код приходится писать в одну строку, иначе в коде появляется лишний <br>.
Спасибо за желчь. Пробовал заменить \n внутри тега HTML: на временную строчку: lRkN5a1Bk0QHC32hWWsp - почти сработало. Но моя регулярка заменяет только первый попавшийся \n, а не все. Как сделать чтобы заменяла все - я не знаю. Код (PHP): <?php $text = preg_replace("'\[html\](.*?)\n(.*?)\[\/h tml\]'is", "\[html\]\\1lRkN5a1Bk0QHC32hWWsp\\2\[\/html\] ", $text); $text = str_ireplace("\n", "<*br>", $text); //без * - форум глючит $text = str_replace("lRkN5a1Bk0QHC32hWWsp", "\n", $text); ?>
я не шарю в регулярках. То есть совсем. Но я точно знаю, что можно. =) Эта регулярка ничем не будет отличаться от других регулярок.
Код (PHP): <?php $in = 'Текст Текст Текст [html]Текст Текст Текст[/html] Текст Текст'; if(($start = strpos($in, '[html]')) !== false and ($end = strpos($in, '[/html]')) !== false and $start < $end) { $out = nl2br(substr($in, 0, $start)) . substr($in, $start, $end + 7 - $start) . nl2br(substr($in, $end + 7)); } else { $out = nl2br($in); } echo($out); ?>
Код (PHP): $in = 'Текст1 Текст2 Текст3 [html]Текст4 Текст5 Текст6[/html] Текст7 Текст8'; echo preg_replace('#((?<=\[\/html\]).+|.+(?=\[html\]))#isue',"nl2br('\\1')",$in); или аналогично но через preg_replace_callback()
sobachnik, ты взорвал мне мозг и поломал жизнь.) Каааак оно работает? Откуда взялись переменные $start и $end?
Я сначала прочитал == вместо =, ну вы поняли.)) Оно работает идеально, но только если HTML: в тексте встречается всего раз. runcore, в твоей регулярке была ошибка: Код (PHP): preg_replace('#((?<=\[\/html\]).+|.+(?=\[html\]))#isue',nl2br("'\\1'"),$in); А результат тот же самый - срабатывает всего для одного тега HTML: . =(
Заговнокодил костыль. Вроде работает. Код (PHP): $ar = explode('html]', $in); $new = null; foreach($ar as $a){ if(substr($a, strlen($a)-2) != '[/') { $a = nl2br($a); } $new .= $a.'html]'; } $out = substr($new, 0, strlen($new)-5); return $out;
я показал направление решения. надо было просто додумать под себя и попробовать через preg_replace_callback() как я там и написал. Код (PHP): $out = preg_replace_callback( '#(?<=\[\/html\]|^).+?(?=\[html\]|$)#isu' ,create_function('$m','return nl2br($m[0]);') ,$in );
Я не шарю в регулярках, поэтому пишу костыли. =\ Последняя регулярка не обрабатывает первый тэг HTML: , если с него начинается текст.
Теперь конфликт с другими бб-кодами. =) Если сделать так, то nl2br внутри тега b не срабатывает: Код (PHP): $in = '[b]asdasdsad asdasdasd <div class="test"></div> <div class="test"></div> asdasd asdasd[/b] [html]html<div class="test"></div> <div class="test"></div> html[/html]';