diff --git a/src/mkdocs_autorefs/references.py b/src/mkdocs_autorefs/references.py
index 66b4931..da1c863 100644
--- a/src/mkdocs_autorefs/references.py
+++ b/src/mkdocs_autorefs/references.py
@@ -15,9 +15,10 @@
 if TYPE_CHECKING:
     from markdown import Markdown
 
+_ATTR_VALUE = r'"[^"<>]+"|[^"<> ]+'  # Possibly with double quotes around
 AUTO_REF_RE = re.compile(
-    r"<span data-(?P<kind>autorefs-identifier|autorefs-optional|autorefs-optional-hover)="
-    r'("?)(?P<identifier>[^"<>]*)\2>(?P<title>.*?)</span>',
+    rf"<span data-(?P<kind>autorefs-(?:identifier|optional|optional-hover))=(?P<identifier>{_ATTR_VALUE})"
+    rf"(?: class=(?P<class>{_ATTR_VALUE}))?(?P<attrs> [^<>]+)?>(?P<title>.*?)</span>",
     flags=re.DOTALL,
 )
 """A regular expression to match mkdocs-autorefs' special reference markers
@@ -154,9 +155,11 @@ def fix_ref(url_mapper: Callable[[str], str], unmapped: list[str]) -> Callable:
     """
 
     def inner(match: Match) -> str:
-        identifier = match["identifier"]
+        identifier = match["identifier"].strip('"')
         title = match["title"]
         kind = match["kind"]
+        attrs = match["attrs"] or ""
+        classes = (match["class"] or "").strip('"').split()
 
         try:
             url = url_mapper(unescape(identifier))
@@ -172,11 +175,11 @@ def inner(match: Match) -> str:
 
         parsed = urlsplit(url)
         external = parsed.scheme or parsed.netloc
-        classes = ["autorefs", "autorefs-external" if external else "autorefs-internal"]
+        classes = ["autorefs", "autorefs-external" if external else "autorefs-internal", *classes]
         class_attr = " ".join(classes)
         if kind == "autorefs-optional-hover":
-            return f'<a class="{class_attr}" title="{identifier}" href="{escape(url)}">{title}</a>'
-        return f'<a class="{class_attr}" href="{escape(url)}">{title}</a>'
+            return f'<a class="{class_attr}" title="{identifier}" href="{escape(url)}"{attrs}>{title}</a>'
+        return f'<a class="{class_attr}" href="{escape(url)}"{attrs}>{title}</a>'
 
     return inner
 
diff --git a/tests/test_references.py b/tests/test_references.py
index 5a25844..49cdc83 100644
--- a/tests/test_references.py
+++ b/tests/test_references.py
@@ -224,3 +224,11 @@ def test_external_references() -> None:
     output, unmapped = fix_refs(source, url_map.__getitem__)
     assert output == '<a class="autorefs autorefs-external" href="https://example.com">example</a>'
     assert unmapped == []
+
+
+def test_keep_data_attributes() -> None:
+    """Keep HTML data attributes from autorefs spans."""
+    url_map = {"example": "https://e.com"}
+    source = '<span data-autorefs-optional="example" class="hi ho" data-foo data-bar="0">e</span>'
+    output, _ = fix_refs(source, url_map.__getitem__)
+    assert output == '<a class="autorefs autorefs-external hi ho" href="https://e.com" data-foo data-bar="0">e</a>'