Перейти к основному содержимому
claw
am
tools
Инструменты
Документы
Daoark
EN
Главная
Главная
/
Инструменты разработчика
›
'}); i += 2; continue; } // 注释 if (c === '/' && src[i+1] === '/') { var k = i; while (k < n && src[k] !== '\n') k++; tokens.push({type: 'T_COMMENT', value: src.substring(i, k)}); i = k; continue; } if (c === '#') { var k2 = i; while (k2 < n && src[k2] !== '\n') k2++; tokens.push({type: 'T_COMMENT', value: src.substring(i, k2)}); i = k2; continue; } if (c === '/' && src[i+1] === '*') { var k3 = i + 2; while (k3 < n - 1 && !(src[k3] === '*' && src[k3+1] === '/')) k3++; k3 = Math.min(k3 + 2, n); tokens.push({type: 'T_COMMENT', value: src.substring(i, k3)}); i = k3; continue; } // 字符串 if (c === '"' || c === '\'') { var q = c; var k4 = i + 1; while (k4 < n && src[k4] !== q) { if (src[k4] === '\\') k4++; k4++; } k4 = Math.min(k4 + 1, n); tokens.push({type: 'T_CONSTANT_ENCAPSED_STRING', value: src.substring(i, k4)}); i = k4; continue; } // 数字 if (/[0-9]/.test(c) || (c === '.' && /[0-9]/.test(src[i+1] || ''))) { var k5 = i; while (k5 < n && /[0-9.eE+\-]/.test(src[k5])) k5++; tokens.push({type: /[\.eE]/.test(src.substring(i, k5)) ? 'T_DNUMBER' : 'T_LNUMBER', value: src.substring(i, k5)}); i = k5; continue; } // 变量 if (c === '$') { var k6 = i + 1; while (k6 < n && /[A-Za-z0-9_]/.test(src[k6])) k6++; tokens.push({type: 'T_VARIABLE', value: src.substring(i, k6)}); i = k6; continue; } // 标识符/关键字 if (/[A-Za-z_]/.test(c)) { var k7 = i; while (k7 < n && /[A-Za-z0-9_]/.test(src[k7])) k7++; var word = src.substring(i, k7); if (KEYWORDS.indexOf(word.toLowerCase()) !== -1) { tokens.push({type: 'T_KEYWORD', value: word}); } else { tokens.push({type: 'T_STRING', value: word}); } i = k7; continue; } // 单字符符号 var single = '(){}[];,.:?+-*/%=<>!&|^~@'; if (single.indexOf(c) !== -1) { // 尝试多字符运算符 var two = src.substr(i, 2); if (['==','!=','<=','>=','<>','&&','||','++','--','+=','-=','*=','/=','%=','**','=>','::','?->','??','<<','>>'].indexOf(two) !== -1) { tokens.push({type: 'T_OPERATOR', value: two}); i += 2; } else { tokens.push({type: 'T_SINGLE_CHAR', value: c}); i++; } continue; } // 其他字符 tokens.push({type: 'T_OTHER', value: c}); i++; } return tokens; } function lowerKeywords(src) { var tokens = tokenize(src); return tokens.map(function(t){ if (t.type === 'T_KEYWORD') return {type: t.type, value: t.value.toLowerCase()}; if (t.type === 'T_CONSTANT_ENCAPSED_STRING') { // 保留字符串字面量原样 return t; } return t; }); } function formatPhp(src, lower) { var tokens = lower ? lowerKeywords(src) : tokenize(src); // 重组: 关键字后空格,逗号后空格,二元运算符两侧空格,大括号独立成行 var out = ''; var indent = 0; var indentStr = ' '; var pendingNewline = false; function nl() { out += '\n' + indentStr.repeat(indent); } function sp() { if (out && !out.endsWith('\n') && !out.endsWith(' ') && !out.match(/[({[]$/)) out += ' '; } for (var i = 0; i < tokens.length; i++) { var t = tokens[i]; var next = tokens[i+1]; var prev = tokens[i-1]; if (t.type === 'T_WHITESPACE') { // 替换为单空格,除非是换行 var lines = t.value.split('\n'); if (lines.length > 1) { // 保留换行,但重新控制缩进 if (out && !out.endsWith('\n')) out += '\n' + indentStr.repeat(indent); } else { // 单词间需要空格 } continue; } if (t.type === 'T_COMMENT') { sp(); out += t.value; // 行注释后换行 if (t.value.indexOf('//') === 0 || t.value[0] === '#') out += '\n' + indentStr.repeat(indent); continue; } if (t.type === 'T_OPEN_TAG') { if (out && !out.endsWith('\n')) out += '\n'; out += '\n'; continue; } if (t.type === 'T_KEYWORD' || t.type === 'T_STRING' || t.type === 'T_VARIABLE' || t.type === 'T_CONSTANT_ENCAPSED_STRING' || t.type === 'T_LNUMBER' || t.type === 'T_DNUMBER') { // 关键字前空格 (除非是开头或已经在标点后) if (out && !out.endsWith(' ') && !out.endsWith('\n') && !out.match(/[({[,;:!&|<>=?+\-*/%^~]$/)) { out += ' '; } else if (out.match(/[({[]$/)) { // 紧跟左括号不加空格 (例如 function (... } out += t.value; continue; } if (t.type === 'T_OPERATOR' || t.type === 'T_SINGLE_CHAR') { var v = t.value; if (v === '{') { // 关键字后的大括号: 同行 or 换行 if (out && !out.endsWith(' ') && !out.endsWith('\n')) out += ' '; out += '{'; indent++; nl(); } else if (v === '}') { indent = Math.max(0, indent - 1); if (out && !out.endsWith('\n')) out += '\n'; out += indentStr.repeat(indent) + '}'; } else if (v === ';') { out += ';'; nl(); } else if (v === ',') { out += ', '; } else if (v === '(' || v === '[') { out += v; } else if (v === ')' || v === ']') { out += v; } else if (v === ':') { // 三元或备择语法,简化处理 if (next && next.type === 'T_KEYWORD' && ['case','default','else','elseif','endif','endforeach','endfor','endwhile','endswitch'].indexOf(next.value) !== -1) { // 备择语法结尾, 例如 endif; out += ':'; } else { out += ' : '; } } else { // 运算符两侧空格 if (!out.endsWith(' ') && out.length > 0 && !out.endsWith('\n')) out += ' '; out += v; if (next && next.type !== 'T_WHITESPACE' && next.type !== 'T_COMMENT' && next.value !== ';' && next.value !== ',' && next.value !== ')') { out += ' '; } } continue; } if (t.type === 'T_OTHER') { out += t.value; continue; } } // 清理连续空行 out = out.replace(/\n{3,}/g, '\n\n'); // 移除行尾空白 out = out.split('\n').map(function(l){ return l.replace(/[ \t]+$/, ''); }).join('\n'); return out.trim(); } document.getElementById('f').addEventListener('submit', function(e) { e.preventDefault(); errorMsg.textContent = ''; btnMain.disabled = true; try { var style = document.getElementById('style').value; var lower = document.getElementById('lowerKw').checked; var src = document.getElementById('src').value; if (!src.trim()) throw new Error('请输入 PHP 代码'); var output = formatPhp(src, lower); resultMeta.textContent = '风格: ' + style + ' · 输入 ' + src.length + ' 字符 · 输出 ' + output.length + ' 字符'; resultContent.innerHTML = '
Entrada
' + src.replace(/&/g,'&').replace(/
' + '
Saída
' + output.replace(/&/g,'&').replace(/
'; resultArea.classList.add('show'); } catch (err) { errorMsg.textContent = '错误: ' + err.message; resultArea.classList.remove('show'); } finally { btnMain.disabled = false; } }); })();