2009-08-14 6 views
2

Я делаю форму (html & php), которая является частью раздела администратора, используемого для редактирования контента для веб-сайта. Я хочу разрешить пользователям включать некоторые базовые html. Это прекрасно работает. Я хочу сохранить разрывы строк. Это также работает. Моя проблема заключается в том, что, когда кто-то пишет что-то вроде этого:Удалить разрывы строк из-за html-тегов

<ul> 
<li>item one</li> 
<li>item two</li> 
</ul> 

разрывы строк между строками кода сохраняются и превратился в БЗ, когда выписали. Это означает, что между каждым элементом LI существует двойной интервал. Теперь это можно исправить, написав весь раздел списка на одной строке, но а), что делает его запутанным для чтения, и б) он достаточно усерден, чтобы обучать людей использованию кодов, не говоря уже об объяснении лишних разрывов строк.

Что мне нужно - это какой-то способ снять все/n, но ТОЛЬКО между тегами UL и/UL.

+0

Вы уверены, что раздел админ не имеет раздел HTML при вставке содержимого, что, как правило, в нужном месте, чтобы делать такие вещи, как это. –

+0

удалил тег PHP, так как это вопрос о HTML, независимо от того, какой сценарий на стороне сервера вы используете ... – RuudKok

+0

@Zaagmans: Но он захочет реализовать на PHP. Это может сильно отличаться от других языков. –

ответ

4

Это регулярное выражение удаляет все переносы строки/пробельные между <ul> и </ul>, которые не являются частью текста между примером <li> и </li>

/(?<=<ul>|<\/li>)\s*?(?=<\/ul>|<li>)/is 

PHP:

$output = preg_replace('/(?<=<ul>|<\/li>)\s*?(?=<\/ul>|<li>)/is', '', $input); 

вход:

<ul> 
<li>item one</li> 
<li>item two</li> 
</ul> 

Выход:

<ul><li>item one</li><li>item two</li></ul> 

EDIT: фиксированный

+0

Это выглядит идеально, но приносит ошибку: Предупреждение: preg_replace() [function.preg-replace]: Неизвестный модификатор 'l' in ... Я не слишком горячий по регулярному выражению ... есть ли опечатка там? –

+0

проверено на php5. работает на меня. –

+0

Weird ... Я использую PHP 5.2.9. Это нижний регистр L, который выдает ошибку. Если я возьму Ls, он выдает ошибку на <вместо. –

0

Вы могли бы уйти с использованием регулярных выражений, хотя это не сработает, если HTML не хорошо сформированы. Это должно соответствовать всем тегам HTML, потому что по умолчанию регулярное выражение является жадным.

<?php 

$str = "Hello 

    <ul> 
    <li>item one</li> 
    <li>item two</li> 
    </ul>"; 

$str = preg_replace_callback('~\<[^>]+\>.*\</[^>]+\>~ms','stripNewLines', $str); 

function stripNewLines($match) { 
    return str_replace(array("\r", "\n"), '', $match[0]); 
} 

echo nl2br($str); 

Редактировать

На самом деле, это не будет работать. Если между блоками есть два блока HTML с обычным текстом, текст в середине также будет удален.

0

У меня возникли проблемы с пониманием того, почему разрывы строк превращаются в <BR>.

Что это значит? Это PHP?

Не обрабатывает ли HTML разрыв строки так же, как пробел? Включение их в <BR> не кажется правильным.

+0

Разрывы строк сохраняются как/n в базе данных, но когда они выписаны на переднем конце, я использую nl2br, чтобы изменить их на
. Это имеет смысл большую часть времени. Это проблема только при использовании списков. –

0

Это пример, чтобы заменить разрывы строк в HTML тег:

public function testLineBreaks() 
{ 
    $html = '<span class="text" 
    >some title</span>'; 

    $pattern = "#</?\w+((\s+\w+(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)/?>#"; 
    $html = preg_replace_callback(
     $pattern, 
     function($match){ 
      $txt = str_replace(array("\r", "\n"), ' ', $match[0]); 
      return preg_replace("/[[:blank:]]+/"," ",$txt); 
     },$html 
    ); 

    $this->assertEquals('<span class="text" >some title</span>', $html); 
} 
Смежные вопросы