【问题标题】:How to replace all new lines in HTML content but preserve new lines inside textarea?如何替换 HTML 内容中的所有新行但在 textarea 中保留新行?
【发布时间】:2019-02-22 16:11:23
【问题描述】:

我有一个存储所有缓冲输出的 PHP 系统,在转储它之前,我删除了空白中的所有新行和空格。这很有效。

$content = Buffer::getKill();
$content = preg_replace(
[
    '/[\n\r]|/',
    '# {2,}#',
    '#> <#'
],
[
    '',
    ' ',
    '><'
],
$content
);

我尝试更改的响应模式如下'/[\n\r]|/',但我没有成功。

问题是当我在内容中有一个 textarea 时,新的 textarea 行也会丢失。我尝试了几种方法来执行正则表达式,但我无法得到结果,因为我对正则表达式感到意外。

以下是示例代码及其输出。

<html>
    <body>
        <div>
            <textarea>
                The
                Content
                Here 
            </textarea>
        </div> 
    </body>
</html>

输出

<html><body><div><textarea>TheContentHere</textarea></div></body></html>

预期

<html><body><div><textarea>
    The
    Content
    Here
</textarea></div></body></html>

【问题讨论】:

  • 为什么必须删除所有这些?
  • 我想减小 html 的大小,让浏览器更容易阅读。
  • 是的,我想到了这一点,但是我相信正则表达式的正确模式会快千分之几。如果您找不到理想的解决方案,我会按照您说的那样尝试。

标签: php html regex preg-replace


【解决方案1】:
(?!<textarea[^>]*?>)(\n)(?![^<]*?<\/textarea>)

这将匹配不在文本区域标签之间的任何换行符。

【讨论】:

    【解决方案2】:

    这是一个查找 &gt; 的正则表达式,后跟换行符(\n\r\n),后跟任意数量的空格和 &lt;

    $html = preg_replace('#>[\n\r\n]?\s+<#', '><', $html);
    

    哪些输出:

    <html><body><div><textarea> 
         The 
         Content 
         Here 
         </textarea></div></body></html>
    

    这不是完美的,但更接近。

    【讨论】:

    • \s 已经包含了\r & \n 所以,$html = preg_replace('#&gt;\s+&lt;#', '&gt;&lt;', $html); 就足够了。
    • 感谢 Toto 我没有意识到空格 \s 会覆盖新行!
    猜你喜欢
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2011-01-27
    相关资源
    最近更新 更多