【发布时间】:2018-10-25 04:24:42
【问题描述】:
关于 SO 有许多关于删除空格的问题,通常用 preg_replace('/[\s]{2,}/, '', $string) 或类似答案来回答,该答案需要多个空格字符并将它们删除或替换为其中一个字符。
当允许某些空格重复时,这会变得更加复杂(例如,允许和相关的具有两个换行符和一个换行符的文本块),此外还结合空白字符(\n、\r)。
这里有一些示例文本,虽然杂乱无章,但涵盖了我认为您最终可能会尝试以合理的方式呈现的内容(例如,以前使用 HTML 格式化但现在被剥离的用户输入)
$text = "\nDear Miss Test McTestFace,\r\n \n We have received your customer support request about:\n \tA bug on our website\n \t \n \n \n We will be in touch by : \n\r\tNext Wednesday. \n \r\n \n Thank you for your custom; \n \r \t \n If you have further questions please feel free to email us. \n \n\r\n \n Sincerely \n \n Customer service team \n \n";
如果我们的目标是采用以下格式:
亲爱的 Test McTestFace 小姐,
我们已收到您关于以下内容的客户支持请求: 网站
我们将在下周三之前与您联系。
感谢您的定制;
如果您还有其他问题,请随时给我们发送电子邮件。
真诚的
客户服务团队
我们将如何实现这一点 - 简单的正则表达式、更复杂的迭代,还是已经有库可以做到这一点?
还有什么方法可以让测试用例变得更复杂,从而提供更强大的整体算法?
【问题讨论】:
-
就我个人而言,我会使用 HTML 并使用解析器来确定新行/段落是否合适。
-
如果我们知道底层数据最初是 HTML,那肯定可以工作。在我的应用程序的特定情况下,我们已经在标签剥离后 存储了数据,因此需要一种方法来清理它以进行演示(在某些情况下,之后重新编码为 HTML)
-
这很不幸。你肯定会更容易在源头而不是事后修复它......事后尝试你无法区分
<p>P1</p><p>P2</p>(没有空格!) -
在这种情况下,我们知道原始过程采取了一种直截了当的方法,即先将每个块级结束标记替换为自身与“\n”连接。但是我想有一个一般情况下混乱的空白(例如解析 PDF 或 doc 文件,从用户程序粘贴的数据)类似于后 HTML 条的情况。
标签: php string text-parsing