PHP:通过合并换行符并正确删除空格来清理HTML

时间:2016-01-17 17:19:43

标签: php html

我正在使用WYSIWYG编辑器,并且有一堆正则表达式来处理脏HTML。原因:我的用户经常经常点击回车键并产生许多冗余的新行,例如:

  • <br><br><br> ...
  • <p> <br /> </p>
  • <p> <br /><br /> </p>
  • <p> <br /> </p>
  • <p> &nbsp; <br /> </p>
  • <p> &nbsp; <br /> </p>
  • 以及更多品种,包括p&nbsp;br

这就是我当前尝试对抗此类输入的方法,尝试使用许多不同的正则表达式将多个连续换行合并为1:

// merge empty p tags into one
// http://stackoverflow.com/q/16809336/1066234
$content = preg_replace('/((<p\s*\/?>\s*)&nbsp;(<\/p\s*\/?>\s*))+/im', "<p>&nbsp;</p>\n", $content);

// remove sceditor's: <p>\n<br>\n</p> from end of string
// http://stackoverflow.com/questions/25269584/how-to-replace-pbr-p-from-end-of-string-that-contain-whitespaces-linebrea
// \s* matches any number of whitespace characters (" ", \t, \n, etc)
// (?:...)+ matches one or more (without capturing the group)
// $ forces match to only be made at the end of the string
$content = preg_replace("/(?:<p>\s*(<br>\s*)+\s*<\/p>\s*)+$/", "", $content);

// remove sceditor's double: http://http://
$content = str_replace('http://http://', 'http://', $content);

// remove spaces from end of string (&nbsp;)
$content = preg_replace('/(&nbsp;)+$/', '', $content);

// remove also <p><br></p> from end of string
$content = preg_replace('/(<p><br><\/p>)+$/', '', $content);

// remove line breaks from end of string - $ is end of line, +$ is end of line including \n
// html with <p>&nbsp;</p>
$content = preg_replace('/(<p>&nbsp;<\/p>)+$/', '', $content);
$content = preg_replace('/(<br>)+$/', '', $content);

// remove line breaks from beginning of string
$content = preg_replace('/^(<p>&nbsp;<\/p>)+/', '', $content);

我正在寻找新的解决方案。是否有任何HTML解析器,我可以告诉合并换行符和空格?或者也许某人有另一种方法解决这个问题。

上面的正则表达式解决方案看起来不够正确,因为我的用户的“尝试”换行的新组合无法通过。

2 个答案:

答案 0 :(得分:0)

我开发了以下代码段,用于删除重复的br - 标记。

<?php
$content = "<h1>Hello World</h1><p>Test\r\n<br>\r\n<br >\r\n<br    >\r\n<br/>Test\r\n<br />\r\n<br    /></p>";

echo "<code>{$content}</code><hr>\r\n\r\n\r\n\r\n";

$contentStripped = preg_replace('/(<br {0,}\/{0,1}>(\\r|\\n){0,}){2,}/', '<br class="reduced" />', $content);
echo "<code>{$contentStripped}</code>\r\n\r\n\r\n\r\n";

enter image description here
您可能需要添加更多测试用例。

答案 1 :(得分:-1)

你可以使用nl2br(strip_tags($ content))而不是长码。