文本分割器php代码

47 阅读1分钟

支持按字符数、句子、段落、正则表达式灯方式灵活切割文本。支持复制内容或者直接上传txt文档。

image.png

有大佬可以继续完善下,目前的测试的地址这个:diuta.com/app/txt.php

代码如下:

// 定义允许的文件类型
define('ALLOWED_MIME', ['text/plain']);
define('MAX_FILE_SIZE', 1048576); // 1MB
 
// 处理表单提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $output = [];
    $error = '';
     
    try {
        // 获取输入文本
        $text = '';
        if (isset($_FILES['uploadFile']) && $_FILES['uploadFile']['error'] === UPLOAD_ERR_OK) {
            // 验证上传文件
            if ($_FILES['uploadFile']['size'] > MAX_FILE_SIZE) {
                throw new Exception('文件大小超过限制');
            }
            if (!in_array($_FILES['uploadFile']['type'], ALLOWED_MIME)) {
                throw new Exception('仅支持文本文件');
            }
            $text = file_get_contents($_FILES['uploadFile']['tmp_name']);
        } else {
            $text = $_POST['textInput'] ?? '';
        }
 
        // 验证输入内容
        if (empty($text)) {
            throw new Exception('请输入文本或上传文件');
        }
 
        // 获取分割参数
        $splitType = $_POST['splitType'] ?? 'character';
        $splitParam = $_POST['splitParam'] ?? '';
        $outputFormat = $_POST['outputFormat'] ?? 'text';
 
        // 执行分割操作
        $output = splitText($text, $splitType, $splitParam);
 
        // 格式化输出
        $output = formatOutput($output, $outputFormat);
 
    } catch (Exception $e) {
        $error = $e->getMessage();
    }
}
 
/**
 * 文本分割函数
 */
function splitText($text, $type, $param) {
    switch ($type) {
        case 'character':
            $chunkSize = max(1, (int)$param ?: 100);
            return str_split($text, $chunkSize);
             
        case 'line':
            return explode(PHP_EOL, $text);
             
        case 'custom':
            $delimiter = empty($param) ? ',' : $param;
            return explode($delimiter, $text);
             
        case 'regex':
            return preg_split('/'.$param.'/', $text, -1, PREG_SPLIT_NO_EMPTY);
             
        default:
            throw new Exception('无效的分割类型');
    }
}
 
/**
 * 格式化输出
 */
function formatOutput($data, $format) {
    switch ($format) {
        case 'html':
            return ['<ol>'.implode('', array_map(function($item) {
                return '<li>'.htmlspecialchars($item).'</li>';
            }, $data)).'</ol>'];
             
        case 'json':
            return [json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)];
             
        case 'text':
        default:
            return $data;
    }
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>PHP文本分割器</title>
    <style>
        .container { max-width: 800px; margin: 20px auto; padding: 20px; }
        .form-group { margin-bottom: 15px; }
        .result-box { margin-top: 20px; padding: 15px; border: 1px solid #ddd; }
        pre { white-space: pre-wrap; background: #f5f5f5; padding: 10px; }
    </style>
</head>
<body>
    <div class="container">
        <h1>文本分割器</h1>
         
        <form method="post" enctype="multipart/form-data">
            <div class="form-group">
                <label>输入文本:</label>
                <textarea name="textInput" rows="5" style="width: 100%"><?= isset($_POST['textInput']) ? htmlspecialchars($_POST['textInput']) : '' ?></textarea>
            </div>
             
            <div class="form-group">
                <label>或上传文件:</label>
                <input type="file" name="uploadFile">
            </div>
             
            <div class="form-group">
                <label>分割方式:</label>
                <select name="splitType">
                    <option value="character" <?= ($_POST['splitType'] ?? '') === 'character' ? 'selected' : '' ?>>按字符数</option>
                    <option value="line" <?= ($_POST['splitType'] ?? '') === 'line' ? 'selected' : '' ?>>按行分割</option>
                    <option value="custom" <?= ($_POST['splitType'] ?? '') === 'custom' ? 'selected' : '' ?>>自定义分隔符</option>
                    <option value="regex" <?= ($_POST['splitType'] ?? '') === 'regex' ? 'selected' : '' ?>>正则表达式</option>
                </select>
                <input type="text" name="splitParam" value="<?= htmlspecialchars($_POST['splitParam'] ?? '100') ?>"
                    placeholder="输入参数">
            </div>
             
            <div class="form-group">
                <label>输出格式:</label>
                <select name="outputFormat">
                    <option value="text">纯文本</option>
                    <option value="html">HTML列表</option>
                    <option value="json">JSON</option>
                </select>
            </div>
             
            <button type="submit">执行分割</button>
        </form>
 
        <?php if (isset($error) && $error): ?>
            <div class="result-box error">
                <?= htmlspecialchars($error) ?>
            </div>
        <?php elseif (!empty($output)): ?>
            <div class="result-box">
                <h3>分割结果 (共 <?= count($output) ?> 段)</h3>
                <?php if ($outputFormat === 'json'): ?>
                    <pre><?= htmlspecialchars($output) ?></pre>
                <?php else: ?>
                    <?php foreach ($output as $i => $segment): ?>
                        <div><strong>段 <?= $i+1 ?>:</strong></div>
                        <?php if ($outputFormat === 'html'): ?>
                            <?= $segment ?>
                        <?php else: ?>
                            <pre><?= htmlspecialchars($segment) ?></pre>
                        <?php endif; ?>
                    <?php endforeach; ?>
                <?php endif; ?>
                 
                <div style="margin-top: 15px;">
                    <a href="data:text/plain;charset=utf-8,<?= urlencode(implode("\n", $output)) ?>" download="split_result.txt">
                        下载结果
                    </a>
                </div>
            </div>
        <?php endif; ?>
    </div>
</body>
<center>
@丢塔网diuta.com</center>
</html>

改了一个在wp上面的页面使用的:app.diuta.com/txt

image.png