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

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

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

 

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

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

тема: Удалить повторяющиеся теги <br>
 
 автор: Night_Wolf   (26.12.2008 в 17:24)   письмо автору
 
 

Здравствуйте, помогите пожалуйста с выражением для замены повторяющихся тегов <br> на один. Главный нюанс - межде тегами может оказаться символ переноса строки (\n или \r\n).

Вот пример текста:

Текст текст текст
<br><br />
<br /><br />
Текст текст текст<br><br>
Текст текст<br />
<br><br>
Текст текст текст
<br><br><br /><br /><br /><br /><br><br>
Текст текст текст


Пробовал так:

//и так:
$String=preg_replace('/(<br[^>]*?>){1,}/i','\1',$String);
//и так:
$String=preg_replace("/(<br[^>]*?>){1,}.\n/i",'\1\1',$String);


Ничего хорошего не выходит. Надеюсь на вашу помощь...

  Ответить  
 
 автор: xx77   (26.12.2008 в 17:37)   письмо автору
 
   для: Night_Wolf   (26.12.2008 в 17:24)
 

*? совсем необязательно, т.к [^>]* и так не включит не одного >
наверное лучше как-то сразу заменять вместе с пробельными символами \s на последнее совпадение
<?
$String
=preg_replace('/(<br[^>]*>\s*)+/i','\1',$String);

или вообще ничего не захватывать
<?
$String
=preg_replace('/(?:<br[^>]*>\s*)+/i',"<br/>\n",$String);
, но из-за этого может получиться что половина переносов строк будут \r\n а половина \n

  Ответить  
 
 автор: Night_Wolf   (26.12.2008 в 17:48)   письмо автору
 
   для: xx77   (26.12.2008 в 17:37)
 

Спасибо огромное! И 1-й и 2-й варианты решили проблему. Совсем забыл, что \s -любой пробельный символ, в т.ч. и newline (думал это только пробел " ").

Позвольте задать еще один сопутствующий вопрос?


<b>І.   Текст <b>текст </b><br></b><br />


Возможно ли удалить вложенные теги <b>? Хотя текст уже приобрел довольно нормальный вид, но из-за них кое-где все-же пооставались двойные <br>? Просто идей никаких нет, вообще кажется это нереальным при помощи одних лишь регулярных выражений. Но все-же?

Возможно поступлю таким образом:
1. preg_match_all('/<b>*</b>/',$String,$matches) -найти все <b>*</b>
2. strip_tags($matches,'<br>'), исключая <br>
3. Ну и на последок удалить все двойные <br>

Еще раз спасибо!

  Ответить  
 
 автор: xx77   (26.12.2008 в 19:43)   письмо автору
 
   для: Night_Wolf   (26.12.2008 в 17:48)
 

С одной стороны можно удалить все </b> которые выделяют текст который и так уже должен быть<b>жирным <b>шрифтом</b></b>
, но это не всегда повлияет на то будут ли два <br> меж которыми не будет </?b>

если-бы знать что точно это b , и что это только в одном промежутке стоящие среди br теги b,
то можно было-бы так
<pre><?
$text 
'<br><br><br>

<b>Текст текст
<br><b><br>текст   </b><br></b><br><br>

<b>Текст текст
<br><b><br>текст   <br></b></b><br><br>
'
;
// </b><br></b><br> запишет как </b><br/>

echo htmlspecialchars(
  
preg_replace(
  
'~(?:((?:</?b\b[^>]*>\s*)+)?<br[^>]*>(\s+)?)+~i'
  
,'\1<br/>\2'
  
,$text));
?>

если не разбирая лишние-ли </?b> придётся делать что-то такое
<pre><?
$p 
= array(
 
'~(?:<br[^>]*>\s*)+((?:</?b\b[^>]*>\s*)+)~i',
 
'~(?:<br[^>]*>\s*)+~i'
);
$z = array(
 
"\\1<br/>\n",
 
"<br/>\n"
);

echo 
htmlspecialchars(
 
$text preg_replace($p$z ,$text));
?>

Но это не обязательно самое оптимальное
, возможно что-то более шустрое получилось-бы если preg_replace_callback() скормить пачками все эти <br><b>.
и насчёт разбора вложенности тоже или preg_replace_callback() или ~e модификатор

  Ответить  
 
 автор: Night_Wolf   (27.12.2008 в 14:56)   письмо автору
 
   для: xx77   (26.12.2008 в 19:43)
 

Спасибо. Чесно говоря, помог лишь 2-й вариант. Первый удалил махом закрывающий тег </b> в середине текста, выделив весь нижеидущий текст жирным.

Все-же пробую разбирать текст по-строчно, отдельно обрабатывая каждую строку. Дело в том, что каждый тег <b> в тексте - 100% имеет закрывающий </b>. Но это пожалуй единственнон от чего можно плясать.

Вот тут регулярное выражение будет иметь больше шансов, как мне кажется:

Array(
'<b><br/><br/>',
'text <b></b><b><br /><br />';
' <br><br><b><br></b>';
'<br />',
'<br><br><b></b>'
)


И далее array_map().
Попробую модифицировать Ваш паттерн для удаления дублей и пустых тегов.

Спасибо.

  Ответить  
Rambler's Top100
вверх

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