|
|
|
| не так давно занялся php, и руки так и не дошли до регулярных выражений. у меня вопрос как обработать результат функции nl2br(), чтобы несколько подряд знаков перевода строки заменялись на один <br />. | |
|
|
|
|
|
|
|
для: ravil
(13.09.2006 в 22:46)
| |
preg_replace("|(<br />)+|", "<br/>", $text);
|
| |
|
|
|
|
|
|
|
для: 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
(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(), будет ли это быстрее и правильнее и как это сделать (данное выражение не работает) | |
|
|
|
|
|
|
|
для: 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
(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(), это вообще возможно для решения моей задачи? | |
|
|
|