You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式仅替换HTML缩进空格为制表符(不替换内容内空格)

解决PHP替换HTML行首缩进空格为制表符且不影响textarea内容的问题

问题分析

原代码的indent_with_tabs函数会全局替换所有连续4个空格,既没有限定只替换行首的缩进空格,还会错误修改<textarea>标签内部的内容,不符合需求。

修改后的代码

function indent_with_tabs($html)
{
    return preg_replace_callback(
        '/(<textarea[^>]*>.*?<\/textarea>)|(^ {4})/ms',
        function($matches) {
            // 匹配到textarea标签及内容,直接返回原内容不修改
            if (isset($matches[1])) {
                return $matches[1];
            }
            // 替换行首的4个空格为制表符
            return "\t";
        },
        $html
    );
}

// 原测试代码保留
$html = <<<EOF
<html>
    <head>
    </head>
    <body>
        <textarea rows="10" cols="40">    Hello World</textarea>
    </body>
</html>
EOF;

$indented = indent_with_tabs($html);

$expected = <<<EOF
<html>
    <head>
    </head>
    <body>
        <textarea rows="10" cols="40">    Hello World</textarea>
    </body>
</html>
EOF;

$cmp = $indented === $expected;

var_dump($cmp); // 输出 bool(true)

代码说明

  1. 正则表达式解析
    • (<textarea[^>]*>.*?<\/textarea>):匹配完整的<textarea>标签及其内部内容,.*?采用非贪婪匹配,避免错误覆盖多个textarea标签
    • |:分支匹配规则,要么匹配textarea内容,要么匹配行首的4个空格
    • (^ {4}):匹配每一行开头的4个连续空格,m修饰符让^锚定每一行的行首,s修饰符让.可以匹配换行符,确保textarea内部的换行被正确识别
  2. 回调函数逻辑
    • 优先判断是否匹配到textarea内容,若是则直接返回原内容,跳过替换
    • 若匹配到行首的4个空格,则替换为制表符\t

注意事项

如果HTML结构复杂(比如存在不规范的标签嵌套、属性值包含特殊字符),正则匹配可能出现偏差,这种情况下建议使用PHP的DOMDocument类解析HTML,精准区分标签和内容后再处理缩进,兼容性更强。

内容的提问来源于stack exchange,提问作者Viewsonic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:50:18