Вопрос по регулярным выражениям а РНР
пишу
<? php
$text=preg_replace_callback('/[^<pre>(.*)<\/pre>]/','nl2br', $text);
?>
но не работает выдаёт только многго слов Array, немножко менял результат тот же погите....?
1.беру из БД текст, заменяю ВВ коды помещаю часть текста в теги <pre>..</pre>
2.С помощью nl2br($text) вывожу данные.
В тексте все переносы строк сохраняются в том виде в каком они были введены
а то что помещено в <pre>..</pre> ВЫВОДИТСЯ ЧЕРЕЗ СТРОКУ...
то есть между данными появляются пустые строки
Ну так код в студию.
Код:
$text=htmlspecialchars($text);
$reg[]='#\[code\](.*?)\[/code\]#si';
$zam[]='<pre>$1</pre>';
$text=preg_replace($reg,$zam, $text);
$text=nl2br($text);
echo $text;
$reg[]='#\[code\](.*?)\[/code\]#si';
$zam[]='<pre>$1</pre>';
$text=preg_replace($reg,$zam, $text);
$text=nl2br($text);
echo $text;
Получаются двойные переносы.
В этом и проблема, но если nl2br убрать тогда переводы строки введённые при наборе текста не сохранятся при выводе... как быть
Ну как альтернатива... Все <pre>.*</pre> заменяй на какие-то последовательности, и храни где-то, потом nl2br(), и заменяешь те последовательности обратно на 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);
}
}
}
$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);
}
}
}
Несколько "в обход по пшенице", но надёжно.
сделал вот так
Код:
$text=preg_replace("#\[code\](.*)\[/code\]#sie", "'[code]'.preg_replace('/(\\r\\n)|(\\n\\r)|(\\n)|(\\r)/i','<BR>','\\1').'
[/code]
А потом уже ВВ коды заменяю вроде работает, даже понял как ещё изящнее сделать сразу и ВВ коды заменить и \n \r убрать только времени пока нет додумать работает и ладно....
Странно, а в ТЗ было написано "что бы оно выполняло функцию nl2br() ко всему тексту кроме участков внутри тэгов <pre>" :)
Может неправильно сформулировал но ведь суть проблемы я тоже описал Строки в тегах <pre> выводились через пустую строку
Цитата: vadim_k
Может неправильно сформулировал но ведь суть проблемы я тоже описал Строки в тегах <pre> выводились через пустую строку
Ну разумеется! Лёгкая неточность :) Как в фильме:
- Вы что построили?
- Тоннель...
- А нужно было что?
- Мост...