仅在上下文中允许时,使用html换行符替换单个换行符

时间:2015-04-06 08:34:16

标签: php line-breaks nl2br

我希望将单个换行符(双倍已经消失)替换为<br>个标签,但仅在中允许它们在上下文中。

例如,请考虑以下内容:

<ul>
  <li>cat</li>
  <li>dog</li>
  <li>fish</li>
  <li>horse</li>
</ul>

<br>标记在上述代码的许多区域中都不允许 ,但运行通常的简单替换/添加代码,例如使用nl2br()或运行{ {1}}显然不会遵循这些上下文规则。

对于上述内容,您需要遵循以下规则:

  • 换行之前 开始列表标记转换
  • 换行 AFTER 开始列表标记不应
  • 转换
  • 换行之前 开始列表项标记不应该
  • 转换
  • 换行 AFTER 开始列表项标记转换
  • 换行之前 结束列表项标记转换
  • 换行符 AFTER 结束列表商品标记不应转换
  • 换行之前 结束列表标记不应
  • 转换
  • 换行 AFTER 关闭列表标记转换

是否有可以执行此功能的当前功能/库?当然这是一个常见的问题,所以我想必定会有一些东西。

1 个答案:

答案 0 :(得分:1)

这在PHP中很复杂。 nl2br不适合在您要处理的文本中保留HTML,因此您必须使用DOM解析器来执行此操作。

或者您可以编写自己的函数来循环遍历整个文本。每当遇到一个开口<时,它应该保留一个标志,该标志在>之后重置。当遇到换行符时,它可以检查该标志以查看该字符是应该保留还是由<br>替换。这样,您可以逐个字符地构建结果字符串。请注意,无效标记可能很容易破坏这样的功能。

但我认为更简单,更好的解决方案是简单地添加一小块CSS:

white-space: pre-line;

将此应用于列表的父级(并隐式显示在列表及其项目中)。这将导致文本表现正常,但文本中的换行符也会破坏文本。