Как применить форматирование к области текста в течение нескольких делений. - PullRequest
0 голосов
/ 28 июля 2011

У меня есть следующий 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;

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Должны ли {start-hidden} и {end-hidden} быть внутри тегов and как они есть? Придерживаясь html, вы можете использовать что-то вроде (не имеет смысла, чтобы стили «ломали» div, как это делает ваше предложение):

<div>this is line 1</div>
<div style="display:none;">this is line 2</div>
<div>this is line 3</div>

или, как было предложено gred:

<div>this is line 1</div>
<div style="visibility:hidden;">this is line 2</div>
<div>this is line 3</div>

edit: Важно взглянуть на разницу между display:none и visibility:hidden: w3schools по сравнению с видимостью

0 голосов
/ 28 июля 2011

Использовать диапазон:

<div>this is line 1 <span style="visibility:hidden;">{start-hidden}</span></div>
<div>this is line 2</div>
<div><span style="visibility:hidden;">{end-hidden}</span> this is line 3</div>
...