如何优化将制表符分隔尺码表文本转为HTML表格的PHP代码
TSV尺码表转HTML表格代码优化方案
核心优化方向
- 变量名语义化:将原代码中
$ddd/$ggg/$bbb这类无意义临时变量替换为对应业务含义的命名,大幅提升代码可读性 - 换行符兼容处理:原代码仅支持Windows格式的
\r\n换行,优化后适配所有操作系统的换行格式,避免不同来源的txt文件解析出错 - 空行过滤:自动跳过文件首尾、中间的空白行,不会生成无效的空表格行
- HTML内容转义:使用
htmlspecialchars()处理所有输出内容,避免文本中的特殊符号(如<>/&)破坏HTML结构,同时消除XSS安全隐患 - 容错性提升:增加数据合法性判断,避免文件格式不符合预期时抛出PHP警告
- 逻辑拆分:将文件解析、样式定义、表格生成三个逻辑模块拆分,后续修改调整成本更低
- 样式逻辑修正:将原代码中thead的
nth-child选择器改为更直观的指定选择,避免后续thead结构调整时样式失效
优化后完整代码
<?php // 读取TSV尺码表文件 $fileContent = file_get_contents('test.txt'); if ($fileContent === false) { die('尺码表文件读取失败'); } // 解析所有行,兼容任意换行格式,过滤空行 $allLines = preg_split('/\R/', $fileContent); $sizeRows = []; foreach ($allLines as $line) { $trimmedLine = trim($line); if (empty($trimmedLine)) continue; $sizeRows[] = explode("\t", $trimmedLine); } if (count($sizeRows) < 2) { die('尺码表格式不正确,至少需要包含标题和表头'); } $colCount = count($sizeRows[1]); // 定义表格样式 $html = <<<STYLE <style> table { table-layout: fixed; font-size: 14px; text-align: center; border-collapse: collapse; width: 100%; } table thead th, table thead td { padding: 6px; } table tbody th, table tbody td { padding: 3px; border: 1px solid #ddd; } table thead { color: #fff; } table thead tr:first-child>* { background: #b42129; } table thead tr:last-child>* { background: #5f5f5f; } table tbody tr:nth-child(2n)>* { background: #ebebeb; } </style> STYLE; // 生成表格结构 $html .= '<table>'; $html .= '<thead>'; // 第一行:表格总标题 $title = htmlspecialchars($sizeRows[0][0]); $html .= "<tr><th colspan=\"{$colCount}\">{$title}</th></tr>"; // 第二行:表头 $html .= '<tr>'; foreach ($sizeRows[1] as $colName) { $colName = htmlspecialchars($colName); $html .= "<th>{$colName}</th>"; } $html .= '</tr></thead><tbody>'; // 后续行:尺码数据 for ($i = 2; $i < count($sizeRows); $i++) { $row = $sizeRows[$i]; $html .= '<tr>'; foreach ($row as $colIndex => $cell) { $cell = htmlspecialchars($cell); $tag = $colIndex === 0 ? 'th' : 'td'; $html .= "<{$tag}>{$cell}</{$tag}>"; } $html .= '</tr>'; } $html .= '</tbody></table>'; echo $html;
内容的提问来源于stack exchange,提问作者Faye D.
相关产品推荐
相关产品推荐

