|
|
|
| Здравствуйте, помогите пожалуйста с выражением для замены повторяющихся тегов <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);
|
Ничего хорошего не выходит. Надеюсь на вашу помощь... | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: 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>
Еще раз спасибо! | |
|
|
|
|
|
|
|
для: 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 модификатор | |
|
|
|
|
|
|
|
для: 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().
Попробую модифицировать Ваш паттерн для удаления дублей и пустых тегов.
Спасибо. | |
|
|
|