У меня есть следующий HTML.
<div>this is line 1 {start-hidden}</div>
<div>this is line 2</div>
<div>{end-hidden} this is line 3</div>
Я хочу, чтобы текст между {start-hidden} и {end-hidden} не был виден.Как мне этого добиться?Обратите внимание, что «начало скрыто» и «конец скрыто» МОЖЕТ быть в разных местах.Это какая-то дополнительная разметка.
Нужно ли какое-нибудь причудливое регулярное выражение или было бы лучше использовать манипуляции с DOM на стороне сервера?
Спасибо.
Решение, которое я выбрал (с PHP) (для заинтересованных):
Regex для извлечения всего текста (+ html) внутри {start-hidden} и {end-hidden} [назовите эту часть $ inner], а также весь текст до [$ pre] и после [$ post] его.
preg_match('#^(.*?){start-hidden}(.*?){end-hidden}(.*?)$#is', $source, $matches)
Затем удалите все причины появления новых строк внутри $ inner.Удаляйте только те, у которых есть закрывающие теги.
// attempt to remove all sources of new lines
$inner = preg_replace('#<br([^>])*>#is', '', $inner);
$inner = preg_replace('#<div([^>])*>(.*?)</div>#is', '', $inner);
$inner = preg_replace('#<p([^>])*>(.*?)</p>#is', '', $inner);
Затем мы находим каждый оставшийся тег и префикс с помощью и добавляем .
$inner = preg_replace('#(<[^>]+>)#is', '</span>${1}<span class="hidden">', $inner),
Затем префикс $ inner с помощью и добавление
$inner = '<span class="hidden">' . $inner . '</span>';
Наконец, объедините все вместе (и повторите, если вы можете снова preg_match ()).
$source = $pre;
$source .= $inner;
$source .= $post;