30 lines
1.9 KiB
JavaScript
30 lines
1.9 KiB
JavaScript
// ═══════════════════════════════════════════════════════
|
|
// Regex Tester
|
|
// ═══════════════════════════════════════════════════════
|
|
function testRegex() {
|
|
const pattern = document.getElementById('regexPattern').value;
|
|
const flags = document.getElementById('regexFlags').value;
|
|
const input = document.getElementById('regexInput').value;
|
|
const resEl = document.getElementById('regexResults');
|
|
const listEl = document.getElementById('regexMatchList');
|
|
if (!pattern || !input) { resEl.innerHTML = '<span style="color:var(--text-muted)">Enter a pattern and test string...</span>'; listEl.innerHTML=''; return; }
|
|
try {
|
|
const re = new RegExp(pattern, flags);
|
|
// Highlight matches
|
|
let highlighted = input.replace(/[<>&]/g, c => ({'<':'<','>':'>','&':'&'}[c]));
|
|
const safePattern = new RegExp(pattern, flags);
|
|
highlighted = input.replace(safePattern, m => `<span class="regex-match">${m.replace(/[<>&]/g, c => ({'<':'<','>':'>','&':'&'}[c]))}</span>`);
|
|
resEl.innerHTML = highlighted || '<span style="color:var(--text-muted)">No matches</span>';
|
|
// Match list
|
|
const matches = [...input.matchAll(new RegExp(pattern, flags.includes('g') ? flags : flags + 'g'))];
|
|
if (matches.length) {
|
|
listEl.innerHTML = '<div class="panel-label">Matches (' + matches.length + ')</div>' +
|
|
matches.map((m, i) => `<div class="result-row"><div class="label">Match ${i+1}</div><div class="value" onclick="copyText(this.textContent)">${m[0]}</div></div>`).join('');
|
|
} else listEl.innerHTML = '';
|
|
} catch (e) {
|
|
resEl.innerHTML = `<span style="color:var(--red)">${e.message}</span>`;
|
|
listEl.innerHTML = '';
|
|
}
|
|
}
|
|
|