Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: усовершенствовать nl2br()
 
 автор: ravil   (13.09.2006 в 22:46)   письмо автору
 
 

не так давно занялся php, и руки так и не дошли до регулярных выражений. у меня вопрос как обработать результат функции nl2br(), чтобы несколько подряд знаков перевода строки заменялись на один <br />.

   
 
 автор: Саня   (13.09.2006 в 23:58)   письмо автору
 
   для: ravil   (13.09.2006 в 22:46)
 

preg_replace("|(<br />)+|", "<br/>", $text);

   
 
 автор: mihdan   (14.09.2006 в 12:10)   письмо автору
 
   для: ravil   (13.09.2006 в 22:46)
 


<?
function n2br ($str) {
    
$result preg_replace("/(<br>)+/si""<br>"$str);
    
$result preg_replace("/(<br\/>)+/si""<br />"$str);
    return 
$result;
}
?>


Пример вызова ф-ии


<?
$str 
nl2br ("434343\n\n\n\n34t4t545t\n");
echo 
n2br ($str);
?>

   
 
 автор: ravil   (14.09.2006 в 21:46)   письмо автору
 
   для: ravil   (13.09.2006 в 22:46)
 

Спасибо всем, кто отзвался на мою проблему. Методом проб и ошибок я все-таки получил то, что хотел (думаю надо было сразу объяснить это)

function br_fun ($str)
    {
    $str = nl2br($str);
    $result = preg_replace("/(<br \/>\n)+/si", "<br>", $str); // наверно для unix
    $result = preg_replace("/(<br \/>\r\n)+/si", "<br>", $str); // работает для win и php4.0.5+
    return $result;
    }
//в нужном месте
$text = htmlspecialchars($_POST['text']);
echo br_fun($text);

Но у меня возникли вопросы, которые мне одному не решить, да и на будущее надо знать, просветите, пожалуйста:
1. зачем в выражении прямые слэши и "si" (если не трудно ссылки на доступное(с расчетом на програмисток) чтиво)
2. Может проще сделать сразу что нибудь вроде этого:
preg_replace("\n+", "<br>", $text);
без функции nl2br(), будет ли это быстрее и правильнее и как это сделать (данное выражение не работает)

   
 
 автор: cheops   (14.09.2006 в 22:00)   письмо автору
 
   для: ravil   (14.09.2006 в 21:46)
 

1) Слеши обозначают границы, подробнее об этом можно почитать в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=6&id_theme=24280. si - это модификаторы, подробнее об них можно почитать по ссылкам
http://www.softtime.ru/dic/id_group=3&id_dic=133
http://www.softtime.ru/forum/read.php?id_forum=6&id_theme=20215
2) Можно, но использование регулярных выражений медленее, чем nl2br(), менее читабельно (не все знакомы с регулярными выражениями и preg_replace() многих будет ставить в тупик). Кроме того, переводы строк в зависимости от операционной системы бывают разными, в UNIX это \n, в Windows это \r\n, в MacOS это \n\r. Поэтому правильным будет что-то вроде
<?php
  $text 
preg_replace("|\r\n|""<br>"$text);
  
$text preg_replace("|\n\r|""<br>"$text);
  
$text preg_replace("|\n|""<br>"$text);
?>

или хотя бы
<?php
  $text 
preg_replace("|\r\n|""<br>"$text);
  
$text preg_replace("|\n|""<br>"$text);
?>

если не планируется, что текст будет заполняться с Mac-машин. Регулярные выражения медленее обычных функций замены, поэтому логичнее в такой ситуации вообще воспользоваться функцией str_replace()
<?php
  $text 
str_replace("\r\n""<br>"$text);
  
$text str_replace("\n""<br>"$text);
?>

   
 
 автор: ravil   (17.09.2006 в 11:05)   письмо автору
 
   для: ravil   (13.09.2006 в 22:46)
 

В итоге я пришел к сравнению (что быстрее?): это

<?php
function br_fun ($str)
    {
    
$str nl2br($str);
    
$result preg_replace("/(<br \/>\n)+/si""<br>"$str); // наверно для unix
    
$result preg_replace("/(<br \/>\r\n)+/si""<br>"$str); // работает для win и php4.0.5+
    
return $result;
    }

$text htmlspecialchars($_POST['text']);
echo 
br_fun($text);
?>


, или это


<?php
 preg_replace
("|[\r\n]+|si""<br>"htmlspecialchars($_POST['text']));
?>

Я остановился на последнем. Напомню, надо один или несколько знаков перевода строки свести к одному <br> спасибо всем.
PS: мне в предыдущем посте советовали использовать str_replace(), это вообще возможно для решения моей задачи?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования