【问题标题】:How to apply formating to a region of text over several divs.如何将格式应用于多个 div 上的文本区域。
【发布时间】:2011-07-28 12:05:36
【问题描述】:

我有以下 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)(对于那些感兴趣的人):

正则表达式提取 {start-hidden} 和 {end-hidden} 内的所有文本 (+html) [将此部分称为 $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;

【问题讨论】:

  • 你不能只生成 HTML 代码,以标记可以用 div 隐藏的块吗?你为什么要受制于这种表现形式?

标签: html parsing html-parsing


【解决方案1】:

{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>

编辑:看看display:nonevisibility:hidden:w3schools on display vs. visibility 之间的区别很重要

【讨论】:

  • 是的,开始隐藏和结束隐藏可以在任何地方,并且可以在其中包含任何内容。我无法控制输入。
  • 好的,正如您在关于“交叉”的另一个问题中向您提到的那样,您尝试做的是无效的 html。另一个元素内部的每个 html 元素都需要在其父元素有一个结束标签之前有一个结束标签。您需要更好地解释一下您想要对代码做什么。如果您知道 {start-hidden} 和 {end-hidden} 将始终存在,那么您应该在 div 内的部分上使用 span,并隐藏第二个 div。否则,您需要在服务器端代码中涵盖这些情况。
  • 我知道 HTML 无效,所以要求另一种解决方案。我用正则表达式发布了一个(相当讨厌的)解决方案(见问题编辑)。
【解决方案2】:

使用跨度:

<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>

【讨论】:

  • 这不是我想要的。我需要隐藏 2 之间的所有内容。所以“这是第 2 行”也应该被隐藏。
  • 哦...明白了!在这种情况下,您应该尝试在单个 html 元素中生成所有隐藏部分的 html 代码 - 正如其他人在您的问题中所建议的那样 - 这是出于多种原因的最佳解决方案,或者可能在我的代码中还添加可见性隐藏 css 样式在第二个div也是?这可能有点难以编码! - 不知道你用的是什么技术!
猜你喜欢
  • 2013-07-08
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多