Добрый день. Есть flash-сайт с панелью администрирования на php. Когда в админ панели я ввожу текст, он записывается в MySQL базу. На сервере, также, есть php-файл, который при обращении к нему генерирует xml с данными из MySQL. Этот xml читается флеш-сайтом. Проблема с отступами в тексте, которые генерируются сами по себе. От них я хочу избавиться. Вот пример текста в админке: В нём после первого предложения идёт перенос на следующую строку. А после второго предложения — перенос на две строки вниз. И вот что видит флеш-сайт: Как видите, там, где есть переносы на строку вниз добавилось по одному отступу. ------------- При этом, если я в админке пишу текст в таком стиле: то форматирование работает нормально. Я предполагаю, что эти дополнительные отступы от того, что во флеше включено HTML-форматирование (есть такая необходимость). В ходе работы я случайно наткнулся на такой нюанс: если на сервере, есть два xml-файла (не те которые генерируются php, а именно файлы): один в UNIX кодировке, а другой — в DOS\Windows, то в первом случае флеш с включённым HTML форматированием читает текст нормально (без дополнительных отступов), а во втором — с отступами. У меня хостинг на Linux сервере. И я не понимаю, почему сгенерированный сервером XML ведёт себя так как будто бы это файл с DOS\Windows кодировкой? И основной вопрос: как избавиться от лишних переносов строк, сохранив HTML-форматирование для Flash?
<br /> вставил легко, но переносы строк убрать не получается: PHP: <?php $text = 'Восприятие сотворчества дает миракль, изменяя привычную реальность. Александрийская школа заполняет художественный талант, ломая рамки привычных представлений. Роль наблюдаема. Акцентуация, в том числе, релевантно подрывает фактографический аутотренинг, как и предсказывают практические аспекты использования принципов гештальпсихологии в области восприятия, обучения, развития психики, социальных взаимоотношений.'; echo str_replace("", "\n", nl2br($text)); ?> Что здесь неправильно?
PHP: <?php header ('Content-type: text/html; charset=utf-8'); $text = 'Восприятие сотворчества дает миракль, изменяя привычную реальность. Александрийская школа заполняет художественный талант, ломая рамки привычных представлений. Роль наблюдаема. Акцентуация, в том числе, релевантно подрывает фактографический аутотренинг, как и предсказывают практические аспекты использования принципов гештальпсихологии в области восприятия, обучения, развития психики, социальных взаимоотношений.'; $text = str_replace("<br />", "", nl2br($text)); ?> <textarea rows="25" cols="100"><?php echo $text; ?></textarea>
нет, такой вариант не работает: http://darts-design.com/test.php Тут, если посмотреть исходный код страницы, то мы видим переносы, но нигде нету тегов br. А при использовании одной только команды nl2br() теги br добавляются в конец строки, однако они не заменяют собой переносы: http://darts-design.com/test2.php
Проблема решена: PHP: $text = str_replace("\r\n", "", nl2br($text)); Я о таком нюансе с \r\n не знал и пробовал подставлять только \n.
а в каких случаях их нужно использовать или не использовать? От чего это зависит? А то я-то решение нашёл, но почему именно так понять не могу.
по всему выходит что нужно сначала проверить есть ли пары \n\r, если есть - убрать все р и заменять по н, если нету - проверить есть ли \r, заменять по \r, иначе - заменять по \n
не.... preg_replace(/\r\n/Ui..... preg_replace(/[\r\n]/Ui..... и всё. работает очень быстро. быстрее, чем одной регуляркой
Мне тут подсказали, что str_replace работает на много быстрее чем preg_replace. Особенно, если дело касается большого количества текста.
Правильно. Код (Text): $out=str_replace(array("\r\n","\n\r","\r"),"\n",$out); Код (Text): $out=str_replace(array("\r\n","\n\r","\r"),'<br>',$out);//флэшу нужен <br>
прикольно) я массивами никогда не юзал. надо взять на заметку зы: конструкция \n\r неверна. так писать нельзя с вашего позволения поправлю: PHP: <?php $out=str_replace(array("\r\n","\n","\r"),'<br>',$out); //флэшу нужен <br> ?>
Почему же нельзя? В Маке так. Ну по крайней мере так было раньше. У них либо \r, либо \n\r. Так что ничего страшного не произойдет, если лишний раз удостоверимся.
Ну вы не волновайтесь. Это скорее пример. Код (Text): $out=str_replace(array("\r\n","\n\r","\r","\n"),'<br>',$out); Я вообще такими делами занимался Код (Text): $page->html=str_ireplace( array( 'href="/?p='.$tid.'"', "href='/?p=".$tid."'", 'href="?p='.$tid.'"', "href='?p=".$tid."'", 'href="p='.$tid.'"', "href='p=".$tid."'", 'href="['.$tid.']"', "href='[".$tid."]'", 'href="{'.$tid.'}"', "href='{".$tid."}'" ), 'href="'.$prefix.$path.'"',$page->html ); и мне до сих пор не стыдно
Быстрее, но не настолько, что вы ощутите хоть какую-то разницу. Зависит, конечно, еще и от самой регулярки. А, например, если вам понадобится не только заменить переводы на <BR> но и схлопнуть несколько подряд идущих - регулярка будет удобнее и быстрее.
Да, я знаю преимущества preg_replace. Но на флеш-сайте обычно никаких действий с текстом делать не нужно (тем более на стороне сервера). Всем спасибо, очень помогли!