Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по регулярным выражениям а РНР

345
10 июля 2007 года
vadim_k
312 / / 01.08.2006
Пытаюсь написать регулярное выражения что бы оно выполняло функцию nl2br() ко всему тексту кроме участков внутри тэгов <pre>
пишу
<? php
$text=preg_replace_callback('/[^<pre>(.*)<\/pre>]/','nl2br', $text);
?>
но не работает выдаёт только многго слов Array, немножко менял результат тот же погите....?
345
10 июля 2007 года
vadim_k
312 / / 01.08.2006
Помогите решить проблему
1.беру из БД текст, заменяю ВВ коды помещаю часть текста в теги <pre>..</pre>
2.С помощью nl2br($text) вывожу данные.

В тексте все переносы строк сохраняются в том виде в каком они были введены
а то что помещено в <pre>..</pre> ВЫВОДИТСЯ ЧЕРЕЗ СТРОКУ...
то есть между данными появляются пустые строки
13K
10 июля 2007 года
whitehood
73 / / 02.11.2006
Ну так код в студию.
345
11 июля 2007 года
vadim_k
312 / / 01.08.2006
 
Код:
$text=htmlspecialchars($text);
$reg[]='#\[code\](.*?)\[/code\]#si';
$zam[]='<pre>$1</pre>';
$text=preg_replace($reg,$zam, $text);
$text=nl2br($text);
echo $text;
13K
11 июля 2007 года
whitehood
73 / / 02.11.2006
Думаю что функция nl2br лишняя так как она превращает перенос строки в тег <br>, а в теге pre переносы строк не игнорируются.
Получаются двойные переносы.
345
11 июля 2007 года
vadim_k
312 / / 01.08.2006
В этом и проблема, но если nl2br убрать тогда переводы строки введённые при наборе текста не сохранятся при выводе... как быть
244
12 июля 2007 года
UAS
2.0K / / 19.07.2006
Ну как альтернатива... Все <pre>.*</pre> заменяй на какие-то последовательности, и храни где-то, потом nl2br(), и заменяешь те последовательности обратно на pre.. Вот. Изврат, но пахать будет
8
12 июля 2007 года
mfender
3.5K / / 15.06.2005
Вся беда регулярных выражений, что невозможно выбрать и отделить все блоки между тэгами. Как ни крути, он найдёт текст между первым найденным <pre> и последним </pre>. Даже если их несколько.

А как такой вот вариант:
Код:
$doc = new DOMDocument();
$doc->loadHTML($text);
$all = $doc->getElementsByTagName("*");
foreach($all as $node){
    if($node->nodeName != "body" && $node->nodeName != "pre" && $node->nodeName != "html" && strlen($node->nodeValue)){
        my_nl2br($node, $doc);
    }
}

echo $doc->saveHTML();

function my_nl2br(&$node, &$doc){
    $text = explode("\n", $node->nodeValue);
    if(count($text)){
        $node->removeChild($node->childNodes->item(0));
        foreach ($text as $string){
            $node->appendChild(new DOMText($string));
            $br = $doc->createElement("br");
            $node->appendChild($br);
        }
    }
}


Несколько "в обход по пшенице", но надёжно.
345
12 июля 2007 года
vadim_k
312 / / 01.08.2006
Да проблему то вроде решил ещё два дня назад
сделал вот так
 
Код:
$text=preg_replace("#\[code\](.*)\[/code\]#sie", "'[code]'.preg_replace('/(\\r\\n)|(\\n\\r)|(\\n)|(\\r)/i','<BR>','\\1').'
'", $text);
[/code]
А потом уже ВВ коды заменяю вроде работает, даже понял как ещё изящнее сделать сразу и ВВ коды заменить и \n \r убрать только времени пока нет додумать работает и ладно....
8
12 июля 2007 года
mfender
3.5K / / 15.06.2005
Странно, а в ТЗ было написано "что бы оно выполняло функцию nl2br() ко всему тексту кроме участков внутри тэгов <pre>" :)
345
12 июля 2007 года
vadim_k
312 / / 01.08.2006
Может неправильно сформулировал но ведь суть проблемы я тоже описал Строки в тегах <pre> выводились через пустую строку
8
12 июля 2007 года
mfender
3.5K / / 15.06.2005
Цитата: vadim_k
Может неправильно сформулировал но ведь суть проблемы я тоже описал Строки в тегах <pre> выводились через пустую строку


Ну разумеется! Лёгкая неточность :) Как в фильме:
- Вы что построили?
- Тоннель...
- А нужно было что?
- Мост...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог