压缩HTML标记中属性之间的空格

时间:2010-12-07 18:25:16

标签: php attributes newline whitespace

我们刚刚发布了一些代码,以使我们的软件更加用户友好,并且它适得其反。基本上,我们尝试使用<br />标记替换换行符。麻烦的是,有时我们的用户会输入如下代码:

<a
 href='http://nowhere.com'>Nowhere</a>

当我们运行代码时,这会转换为

<a <br />href='http://nowhere.com' />Nowhere</a>

显然无法正确呈现。

是否有正则表达式或PHP函数来剥离或压缩HTML标记属性之间的空格?

澄清:这不是完整的HTML。它更类似于Markdown或其他语言(我们最终会转向Markdown,但我需要快速修复)。所以我不能只将它解析为常规HTML。新行需要正确转换为<br />标记。

4 个答案:

答案 0 :(得分:3)

嗯,为什么在没有为此目的设计时使用工具来格式化html,让你自己成为一个DOM库。

http://simplehtmldom.sourceforge.net/

答案 1 :(得分:2)

你需要一个能够正确解析你抛出的所有HTML的库,你从来不知道用户可能会发明什么。

查看HTML Purifier

答案 2 :(得分:1)

经过一番搜索和反复试验,我得出了以下解决方案/ hack:

/*
 * Compress all whitespace within HTML tags (including PRE at the moment)
 */
$regexp = "/<\/?\w+((\s+(\w|\w[\w-]*\w)(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/i";

preg_match_all($regexp, $text, $matches);

foreach($matches[0] as $match) {
  $new_html = preg_replace('/\s+/', ' ', $match);
  $text = str_replace($match, $new_html, $text);
}

执行此代码后,$text中的所有HTML标记都将正确格式化并且无有换行符时有效。

我知道这不是最好的解决方案,但它确实有效,很快我们就会迁移到真正的标记语言(例如Markdown)。

答案 3 :(得分:0)

理想情况下,您可以通过DOM或SAX API使用XML解析器。但是,如果您的内容不是正确的XML,而是包含少量标签的纯文本,则解析器可能会失败(这取决于所使用的工具,我猜)。

针对您的特定问题的粗略解决方案可能如下:构建具有两个状态的状态机,在标签内部和标签外部。您逐个阅读输入字符。在读取'&lt;'时,切换到“内部”状态。阅读'&gt;'后,切换到“外部”状态。在读取'\ n'并且如果处于“外部”状态时,发出“&lt; br /&gt;” (否则不发射任何东西)。

这只是一个草图,可能需要改进。