dotnet/AspNetCore.Docs · error · Error

Syntax error, unrecognized expression: ${msg}

Error message

Syntax error, unrecognized expression: ${msg}

What it means

Identical guard to error 3 in the 3.x sample's jquery-2.2.0.js: Sizzle.error fires for any unparseable selector passed to jQuery's selector APIs, appending the offending expression.

Source

Thrown at aspnetcore/mvc/controllers/testing/samples/3.x/TestingControllersSample/src/TestingControllersSample/wwwroot/js/jquery-2.2.0.js:1463

        }
    
        var fn = Expr.attrHandle[ name.toLowerCase() ],
            // Don't get fooled by Object.prototype properties (jQuery #13807)
            val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
                fn( elem, name, !documentIsHTML ) :
                undefined;
    
        return val !== undefined ?
            val :
            support.attributes || !documentIsHTML ?
                elem.getAttribute( name ) :
                (val = elem.getAttributeNode(name)) && val.specified ?
                    val.value :
                    null;
    };
    
    Sizzle.error = function( msg ) {
        throw new Error( "Syntax error, unrecognized expression: " + msg );
    };
    
    /**
     * Document sorting and removing duplicates
     * @param {ArrayLike} results
     */
    Sizzle.uniqueSort = function( results ) {
        var elem,
            duplicates = [],
            j = 0,
            i = 0;
    
        // Unless we *know* we can detect duplicates, assume their presence
        hasDuplicate = !support.detectDuplicates;
        sortInput = !support.sortStable && results.slice( 0 );
        results.sort( sortOrder );
    
        if ( hasDuplicate ) {

View on GitHub (pinned to c67a80103a)

Solutions

  1. Escape metacharacters with $.escapeSelector (3.x) or manual escaping.
  2. Use document.getElementById and wrap with $().
  3. Validate/sanitize user-supplied selector input.

Example fix

// before
$('#user.email'); // throws
// after
$('#' + $.escapeSelector('user.email'));
Defensive patterns

Strategy: validation

Validate before calling

function safeIdSelector(id) {
  return '#' + (window.jQuery && jQuery.escapeSelector ? jQuery.escapeSelector(id) : id.replace(/([!\"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g, '\\$1'));
}
$(safeIdSelector(dynamicId)).hide();

Type guard

function looksLikeValidSelector(s) {
  if (typeof s !== 'string' || s.length === 0) return false;
  try { $(s); return true; } catch (e) { return false; }
}

Try / catch

try {
  return $(userSelector);
} catch (e) {
  if (/Syntax error, unrecognized expression/.test(e.message)) {
    console.warn('Invalid selector:', userSelector);
    return $();
  }
  throw e;
}

Prevention

When it happens

Trigger: Invalid selectors ($('[unclosed'), unescaped metacharacters in ids ($('#a.b')), malformed HTML parsed as selector.

Common situations: Dynamic selectors from data; ids with dots/colons/brackets; unsupported pseudo-classes.

Related errors


AI-assisted analysis of dotnet/AspNetCore.Docs@c67a80103a (2026-08-13). Data as JSON: /api/errors/3e2a6464cbd8151f. Report an issue: GitHub.