Skip to main content

Extract Card Numbers

Extract Iranian bank card numbers from text with advanced features including performance optimizations, fuzzy matching, and comprehensive validation.

Features

  • TypeScript Function Overloads: Type-safe extraction based on options
  • Performance Optimized: Handles small to large texts (1MB+) efficiently
  • Multi-Format Support: Persian, Arabic digits and various separators
  • Fuzzy Matching: Partially masked card numbers like 6037-****-8909-5443
  • Context Extraction: Surrounding text analysis
  • Position Tracking: Exact location of matches in text
  • Duplicate Removal: Automatic deduplication
  • Iranian Bank Validation: Integration with Iranian bank validation

Installation

npm install @persian-tools/persian-tools

Basic Usage

import { extractCardNumber } from "@persian-tools/persian-tools";

const text = "My card number is 6037701689095443 for payment";

// Basic extraction with validation
const cards = extractCardNumber(text, {
	checkValidation: true,
	detectBankNumber: true,
});

console.log(cards[0]);
// {
//   index: 1,
//   base: "6037701689095443",
//   pure: "6037701689095443",
//   startIndex: 17,
//   endIndex: 35,
//   isValid: true,
//   bankName: "بانک کشاورزی"
// }

TypeScript Function Overloads

The function provides type-safe overloads based on your options:
// Returns ExtractCardNumberComplete[] (with validation + bank)
const fullResults = extractCardNumber(text, {
	checkValidation: true,
	detectBankNumber: true,
});

// Returns ExtractCardNumberWithValidation[] (validation only)
const validatedResults = extractCardNumber(text, {
	checkValidation: true,
	detectBankNumber: false,
});

// Returns ExtractCardNumberWithBank[] (bank detection only)
const bankResults = extractCardNumber(text, {
	checkValidation: false,
	detectBankNumber: true,
});

// Returns ExtractCardNumberBase[] (basic extraction)
const basicResults = extractCardNumber(text, {
	checkValidation: false,
	detectBankNumber: false,
});

Advanced Options

Performance Optimization

// Large document processing (1MB+)
const hugeDocument = "..."; // Very large text
const results = extractCardNumber(hugeDocument, {
	optimizeForLargeText: true,
	maxResults: 10,
	filterValidCardNumbers: true,
});

Fuzzy Matching

// Extract partially masked card numbers
const maskedText = "Card: 6037-****-8909-5443";
const fuzzyResults = extractCardNumber(maskedText, {
	enableFuzzyMatching: true,
	checkValidation: false,
});

Context Extraction

// Include surrounding text context
const contextResults = extractCardNumber(text, {
	includeContext: true,
	contextLength: 20,
});

console.log(contextResults[0].context);
// {
//   before: "My card number is ",
//   after: " for payment",
//   full: "My card number is 6037701689095443 for payment"
// }

Multi-Format Support

The function automatically handles various formats:
const multiFormatText = `
  Formatted: 6037-7016-8909-5443
  Spaced: 6037 7016 8909 5443
  Persian: ۶۰۳۷۷۰۱۶۸۹۰۹۵۴۴۳
  Arabic: ٦٠٣٧٧٠١٦٨٩٠٩٥٤٤٣
  Dots: 6037.7016.8909.5443
  Underscores: 6037_7016_8909_5443
`;

const results = extractCardNumber(multiFormatText);
// All formats are normalized to: "6037701689095443"

Options Reference

OptionTypeDefaultDescription
checkValidationbooleantrueEnable Luhn algorithm validation
detectBankNumberbooleanfalseDetect Iranian bank names
filterValidCardNumbersbooleantrueFilter out invalid cards when validation enabled
maxResultsnumberunlimitedMaximum number of cards to extract
optimizeForLargeTextbooleanauto-detectEnable performance optimizations
enableFuzzyMatchingbooleanfalseSupport partially masked card numbers
includeContextbooleanfalseInclude surrounding text context
contextLengthnumber20Number of characters for context

Result Types

ExtractCardNumberBase

interface ExtractCardNumberBase {
	index: number; // 1-based position in results
	base: string; // Original matched text
	pure: string; // Normalized card number
	startIndex: number; // Start position in text
	endIndex: number; // End position in text
}

ExtractCardNumberWithValidation

interface ExtractCardNumberWithValidation extends ExtractCardNumberBase {
	isValid: boolean; // Luhn validation result
}

ExtractCardNumberWithBank

interface ExtractCardNumberWithBank extends ExtractCardNumberBase {
	bankName: string | null; // Iranian bank name
}

ExtractCardNumberComplete

interface ExtractCardNumberComplete extends ExtractCardNumberWithValidation, ExtractCardNumberWithBank {}

Performance Characteristics

  • Small texts (< 1KB): < 1ms processing time
  • Medium texts (1KB-10KB): < 10ms processing time
  • Large texts (10KB-100KB): < 50ms with optimization
  • Huge texts (> 100KB): < 200ms with chunking strategy

Iranian Bank Integration

Automatically detects Iranian banks:
const cards = extractCardNumber("Card: 6037701689095443", {
	detectBankNumber: true,
});

console.log(cards[0].bankName); // "بانک کشاورزی"
Supported Iranian banks include:
  • بانک ملی (Bank Melli)
  • بانک کشاورزی (Bank Keshavarzi)
  • بانک تجارت (Bank Tejarat)
  • بانک سپه (Bank Sepah)
  • بانک ملت (Bank Mellat)
  • And 30+ other Iranian banks

Error Handling

The function handles various edge cases gracefully:
// Empty or invalid input
extractCardNumber(""); // Returns []
extractCardNumber(null); // Returns []

// No card numbers found
extractCardNumber("No cards here"); // Returns []

// Malformed card numbers are filtered out
extractCardNumber("Invalid: 123456789"); // Returns []

Migration from v1.x

The v2.0 enhancement maintains 100% backward compatibility:
// v1.x usage continues to work unchanged
const legacyResults = extractCardNumber(text, {
	checkValidation: true,
	detectBankNumber: false,
	filterValidCardNumbers: true,
});

Browser Support

Works in all modern browsers and Node.js environments:
  • Chrome 60+
  • Firefox 55+
  • Safari 12+
  • Edge 79+
  • Node.js 14+