← Script library

Script Includes

String Manipulation Utility

Reusable functions for common string operations, formatting, and transformations.

JavaScript
var StringUtils = Class.create();
StringUtils.prototype = {

  /**
   * Convert string to title case
   * @param {string} str
   * @returns {string}
   */
  toTitleCase: function(str) {
    if (!str) return '';

    return str.toLowerCase().replace(/\b\w/g, function(char) {
      return char.toUpperCase();
    });
  },

  /**
   * Convert string to camel case
   * @param {string} str
   * @returns {string}
   */
  toCamelCase: function(str) {
    if (!str) return '';

    return str.toLowerCase()
      .replace(/[^a-zA-Z0-9]+(.)/g, function(match, char) {
        return char.toUpperCase();
      });
  },

  /**
   * Convert string to snake case
   * @param {string} str
   * @returns {string}
   */
  toSnakeCase: function(str) {
    if (!str) return '';

    return str
      .replace(/([A-Z])/g, '_$1')
      .replace(/[^a-zA-Z0-9]+/g, '_')
      .toLowerCase()
      .replace(/^_+|_+$/g, '');
  },

  /**
   * Truncate string to specified length with ellipsis
   * @param {string} str
   * @param {number} maxLength
   * @param {string} suffix - Default: '...'
   * @returns {string}
   */
  truncate: function(str, maxLength, suffix) {
    if (!str) return '';
    suffix = suffix || '...';

    if (str.length <= maxLength) {
      return str;
    }

    return str.substring(0, maxLength - suffix.length) + suffix;
  },

  /**
   * Remove HTML tags from string
   * @param {string} str
   * @returns {string}
   */
  stripHtml: function(str) {
    if (!str) return '';

    return str.replace(/<[^>]*>/g, '');
  },

  /**
   * Escape HTML special characters
   * @param {string} str
   * @returns {string}
   */
  escapeHtml: function(str) {
    if (!str) return '';

    var map = {
      '&': '&amp;',
      '<': '&lt;',
      '>': '&gt;',
      '"': '&quot;',
      "'": '&#039;'
    };

    return str.replace(/[&<>"']/g, function(char) {
      return map[char];
    });
  },

  /**
   * Mask sensitive information (e.g., credit card, SSN)
   * @param {string} str
   * @param {number} visibleChars - Number of chars to show at end
   * @param {string} maskChar - Character to use for masking
   * @returns {string}
   */
  mask: function(str, visibleChars, maskChar) {
    if (!str) return '';

    visibleChars = visibleChars || 4;
    maskChar = maskChar || '*';

    if (str.length <= visibleChars) {
      return str;
    }

    var masked = '';
    for (var i = 0; i < str.length - visibleChars; i++) {
      masked += maskChar;
    }

    return masked + str.substring(str.length - visibleChars);
  },

  /**
   * Extract numbers from string
   * @param {string} str
   * @returns {string} Numbers only
   */
  extractNumbers: function(str) {
    if (!str) return '';

    return str.replace(/\D/g, '');
  },

  /**
   * Format phone number
   * @param {string} phone
   * @param {string} format - 'us', 'international'
   * @returns {string}
   */
  formatPhone: function(phone, format) {
    if (!phone) return '';

    var digits = this.extractNumbers(phone);
    format = format || 'us';

    if (format === 'us' && digits.length === 10) {
      return '(' + digits.substring(0, 3) + ') ' +
             digits.substring(3, 6) + '-' +
             digits.substring(6);
    }

    if (format === 'international' && digits.length === 11) {
      return '+' + digits.substring(0, 1) + ' (' +
             digits.substring(1, 4) + ') ' +
             digits.substring(4, 7) + '-' +
             digits.substring(7);
    }

    return phone;  // Return original if can't format
  },

  /**
   * Slugify string (URL-friendly)
   * @param {string} str
   * @returns {string}
   */
  slugify: function(str) {
    if (!str) return '';

    return str
      .toLowerCase()
      .replace(/[^\w\s-]/g, '')  // Remove special chars
      .replace(/[\s_]+/g, '-')    // Replace spaces/underscores with hyphens
      .replace(/^-+|-+$/g, '');   // Remove leading/trailing hyphens
  },

  /**
   * Generate random string
   * @param {number} length
   * @param {string} charset - 'alphanumeric', 'alpha', 'numeric', 'hex'
   * @returns {string}
   */
  random: function(length, charset) {
    length = length || 10;
    charset = charset || 'alphanumeric';

    var chars = {
      alphanumeric: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',
      alpha: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
      numeric: '0123456789',
      hex: '0123456789abcdef'
    };

    var charSet = chars[charset] || chars.alphanumeric;
    var result = '';

    for (var i = 0; i < length; i++) {
      var randomIndex = Math.floor(Math.random() * charSet.length);
      result += charSet.charAt(randomIndex);
    }

    return result;
  },

  /**
   * Check if string is valid email
   * @param {string} email
   * @returns {boolean}
   */
  isValidEmail: function(email) {
    if (!email) return false;

    var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    return emailRegex.test(email);
  },

  /**
   * Pluralize word based on count
   * @param {number} count
   * @param {string} singular
   * @param {string} plural - Optional, defaults to singular + 's'
   * @returns {string}
   */
  pluralize: function(count, singular, plural) {
    plural = plural || singular + 's';
    return count === 1 ? singular : plural;
  },

  /**
   * Calculate string similarity (Levenshtein distance)
   * @param {string} str1
   * @param {string} str2
   * @returns {number} Similarity percentage (0-100)
   */
  similarity: function(str1, str2) {
    if (!str1 || !str2) return 0;
    if (str1 === str2) return 100;

    var longer = str1.length > str2.length ? str1 : str2;
    var shorter = str1.length > str2.length ? str2 : str1;

    if (longer.length === 0) return 100;

    var distance = this._levenshteinDistance(longer, shorter);
    return ((longer.length - distance) / longer.length) * 100;
  },

  /**
   * Calculate Levenshtein distance between two strings
   * @private
   */
  _levenshteinDistance: function(str1, str2) {
    var matrix = [];

    for (var i = 0; i <= str2.length; i++) {
      matrix[i] = [i];
    }

    for (var j = 0; j <= str1.length; j++) {
      matrix[0][j] = j;
    }

    for (var i = 1; i <= str2.length; i++) {
      for (var j = 1; j <= str1.length; j++) {
        if (str2.charAt(i - 1) === str1.charAt(j - 1)) {
          matrix[i][j] = matrix[i - 1][j - 1];
        } else {
          matrix[i][j] = Math.min(
            matrix[i - 1][j - 1] + 1,  // substitution
            matrix[i][j - 1] + 1,      // insertion
            matrix[i - 1][j] + 1       // deletion
          );
        }
      }
    }

    return matrix[str2.length][str1.length];
  },

  type: 'StringUtils'
};

How to use it

1. Create a new Script Include named 'StringUtils' 2. Leave 'Client callable' unchecked 3. Copy the code above 4. Use in Business Rules or Background Scripts: var utils = new StringUtils(); var title = utils.toTitleCase('hello world'); // 'Hello World' var slug = utils.slugify('My Blog Post!'); // 'my-blog-post' var masked = utils.mask('1234567890', 4); // '******7890'

Adapt the table names, fields, and conditions to your instance. Test the behavior in a development environment before using it in production.