我们刚刚发布了一些代码,以使我们的软件更加用户友好,并且它适得其反。基本上,我们尝试使用<br />
标记替换换行符。麻烦的是,有时我们的用户会输入如下代码:
<a
href='http://nowhere.com'>Nowhere</a>
当我们运行代码时,这会转换为
<a <br />href='http://nowhere.com' />Nowhere</a>
显然无法正确呈现。
是否有正则表达式或PHP函数来剥离或压缩HTML标记属性之间的空格?
澄清:这不是完整的HTML。它更类似于Markdown或其他语言(我们最终会转向Markdown,但我需要快速修复)。所以我不能只将它解析为常规HTML。新行需要正确转换为<br />
标记。
答案 0 :(得分:3)
嗯,为什么在没有为此目的设计时使用工具来格式化html,让你自己成为一个DOM库。
答案 1 :(得分:2)
你需要一个能够正确解析你抛出的所有HTML的库,你从来不知道用户可能会发明什么。
答案 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;” (否则不发射任何东西)。
这只是一个草图,可能需要改进。