Роберт
Аналитик
Вопрос знатокам регулярных выражений
В базе данных хранятся такие текстики:
Тоесть есть простой текст , и есть текст в тэгах <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 раз замедляет работу регулярного выражения.
В базе данных хранятся такие текстики:
Код:
аааа
ББББ
<hide>1111</hide>
вввв
гггг<hide>2222</hide>
дддд
<hide>3333</hide>ееее
ёёёё
жжжж
<hide>4444</hide>
<hide>5555</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 раз замедляет работу регулярного выражения.
