Вопрос знатокам регулярных выражений

Роберт

Аналитик
Вопрос знатокам регулярных выражений

В базе данных хранятся такие текстики:
Код:
аааа
ББББ
<hide>1111</hide>
вввв
гггг<hide>2222</hide>
дддд
<hide>3333</hide>ееее
ёёёё

жжжж
<hide>4444</hide>
<hide>5555</hide>
зззз
Тоесть есть простой текст , и есть текст в тэгах <hide>...</hide> который надо в зависимости от уровня пользователя , либо показать , либо скрыть.
Чтобы показать всё , достаточно просто удалить теги , например так: $Строка=preg_replace("#</?hide>#",""$Строка)
А чтобы скрыть лишнее от тех кому это нельзя видеть , можно написать:
$Строка=preg_replace("#<hide>(.+?)</hide>#",""$Строка)
Однако тут появляется небольшая , но очень неудобная штучка - удалив строчку "1111" между строками "ББББ" и "вввв" остаются два переходна на новую строку :(
Сократить многократные переходы строк нельзя , так как между строками "ёёёё" и "жжжж" должны остаться два перехода на новую строку.
Заменить регулярное выражение на <hide>(.+?)</hide>(<br>)? нельзя , так как в этом случае строки "гггг" и "дддд" сольются в одну :(
Можно конечно запустить две замены подрят:
$Строка=preg_replace("#<br><hide>(.+?)</hide>(?=<br>)#",""$Строка);
$Строка=preg_replace("#<hide>(.+?)</hide>#",""$Строка)
(выражение <br><hide>(.+?)</hide><br> использовать нельзя так как тогда не совпадёт строка с "5555" ведь предшедствующий <br> уже обработан строкой с "4444")
но это в 2 раза замедляет проверку , а текстовые блоки частенько превышают несколько десятков мегабайт и появляется существенная пауза.
Может здесь есть гуру регулярных выражений , которые могли бы придумать как это выполнить одним выражением? Может даже через preg_replace_callback. Я не могу придумать ничего кроме банального:
$Строка=preg_replace("#<hide>(.+?)</hide>|<br><hide>(.+?)</hide>(?=<br>)#",""$Строка)
но использование "|" в 5 раз замедляет работу регулярного выражения.
 

Роберт

Аналитик
Ты хотел чтобы я написал пример текста в одну непрерывную строку , или не догадался что переходы строк в примере (и в описании) - это и есть "<br>"?
 

Андрейка

Senior pomidor developer
нет, вообщет я думал - тя устроит пример в котором перевод строки это и есть перевод строки (\n)... а ща вообще думаю, что те пойти бы поаналлизировать мануал
 

Роберт

Аналитик
Тогда оставь место для тех кто что-нибудь напишет по сути вопроса...
 

StUV

Rotaredom
Роберт
Тогда оставь место для тех кто что-нибудь напишет по сути вопроса...
вообще говоря - не прав ты
если хочешь получить ответ - разберись с тем где у тебя <br>, а где "\n" и напиши пример своего файла с учетом этого...
 

Роберт

Аналитик
StUV
Любой кто представляет , что такое HTML - отлично это понимает. Да и из кода это видно. А про символ \n - это Андрей придумал (я про него не говорил).
 

Comissar

Новичок
Если все именно так просто, тогда поможет один проход регуляркой, а потом быстрый str_replace, заменяющий '<br><br>' на '<br>'
 

Lews

Новичок
ББББ<hide>
1111</hide>
вввв


$Строка=preg_replace("#<hide>(.+?)</hide>#us",""$Строка)

Т.е. символ перевода строки тоже включать в hide блок.
 

Роберт

Аналитик
Lews
Ну это несовсем наглядно...
Тогда человек который расставляет цензурные тэги должен постоянно думать о том как будет выглядеть текст в "огрониченном режиме" при котором содержимое этих тегов непоказывается.
Вот скажем в твоём вариант если после 1111 идёт ещё какой-то открытый текст , то теги надо ставить уже совсем по другому , иначе последующий текст сольётся с ББББ.
Нельзя просто добисать:
ББББ<hide>
1111</hide>ХХХХ
вввв

чтобы дописать ХХХХ надо ещё и менять положение тегов на
ББББ
<hide>1111</hide>ХХХХ
вввв

что ужастно неудобно. В то время как в моём варианте ничего менять не надо. Хочеш зацензорить текст - ставишь строку в теги. Хочешь что-то дописать - просто дописывай , и не обращай внимание на расположение тегов...
 

Lews

Новичок
Либо повторный разбор, либо правило - в тэги хайд заключать ВСЕ символы, которые должны либо показываться, либо скрываться. Символы переноса строки ТОЖЕ.
И никаких проблем не будет:)

Как вариант - после добавления текста скриптом проделывать этим самы процедуры по замене
ББББ
<hide>1111</hide>
вввв

на

ББББ<hide>
1111</hide>
вввв
 

MiksIr

miksir@home:~$
/<hide>(.+?)</hide>(<br>)?/
ЗЫ: а насчет спора \n и <BR> - вы не правы, и не надо людям хамить. В HTML \n и <BR> - совершенно не одно и то же.
 

Роберт

Аналитик
Lews
Зачем такие сложности? Я ведь в самом начале уже привёл пример рег.выражений , при катором всё работает. Но искал более оптимальное регулярное выражение. Оба твоих варианта категорически не подходят. Даже если человека и научить этим правилам - он будет ошибаться при выставлении хайдов , а когда он будет добавлять информацию - там ещё в 2 раза больеш будет ошибок. И почти тоже самое с предложением чтобы это делал скрипт при сохранении. Да , он сделает , но потом придёт человек , которому после 1111 надо добавить ещё слово , и получится что программа при выводе объединит это слово с ББББ (хотя должно было либо писать вместе с 1111 , либо с новой строки (когда 1111 не видно).

MiksIr
По поводу твоего регулярного выражения - я так понимаю , что ты мой вопрос даже до половины не дочитал. В нём было всего 2 выделенных болдом фразы , и первая из них какраз это регулярное выражение , и дальше пояснение , почему его НЕЛЬЗЯ использовать!
Повторяю её специально для тебя: Заменить регулярное выражение на <hide>(.+?)</hide>(<br>)? нельзя , так как в этом случае строки "гггг" и "дддд" сольются в одну :(
P.S. С символом \n тут Андрейка прилепился , я про него не писал. Тому кто хоть немножечко знает HTML не надо объяснять что переход на новую строку это <br> , тем более когда рядом автор даёт готовые работающие примеры. А если человеку нечего делать и хочется прицепиться - тут уже мало что спасёт , найдёт в предложении пропущенную запятую и понесётся себе посты накручивать...
 

MiksIr

miksir@home:~$
Нет, уважаемый, если вы пишите HTML код, то пишите его _полностью_ ибо в HTML записи \n не имеет никакого веса. Если Вы пишете результаты рендеринга HTML, то там не будут видны теги. Так что, хоть это и мелочь, но свою неправоту надо признавать, тем более что запись вида
Код:
<hide>1111</hide><BR>аааа<BR>ББББ<BR><hide>1111</hide><BR>вввв<BR>гггг<hide>....
гораздо удобнее для анализа.
.
На перле получилось так (без пробела после BR):
Код:
s/(?<=(<BR>))?<hide>.*?<\/hide>\1?//g
не знаю, осилит ли пхп - проверьте. Косяк только один - если текст начнется как ^<hide>...</hide><BR>... то ведущий BR останется.
ЗЫ: и повежливее, люди Вам помочь пытаются, а не Вы им одолжение делаете.
 

hermit_refined

Отшельник
а текстовые блоки частенько превышают несколько десятков мегабайт
хм... а никого не смущает, что человек выбирает из базы десятки мегабайт, обрабатывает регуляркой, а пользователю видимо лишь сотую часть потом отдаёт?
i think, Роберт, вам стоит придумать способ не делать этого.

-~{}~ 17.12.06 10:47:

не надо объяснять что переход на новую строку это <br>
ну и, конечно, поддерживая флешмоб: <br> - это не переход на новую строку. Если же вы хотите сказать, что написали код, видимый в браузере - увы, в нём никакой <hide> не отобразится.
 
Сверху