diff --git a/djhtml/modes.py b/djhtml/modes.py
index 9b9e655..d017da3 100644
--- a/djhtml/modes.py
+++ b/djhtml/modes.py
@@ -241,7 +241,7 @@ def create_token(self, raw_token, src, line):
return token, mode
def _has_closing_token(self, name, raw_token, src):
- if not re.search(f"{{%[-+]? *(end|/){name}(?: .*?|)%}}", src):
+ if not re.search(f"{{%[-+]? *(end_?|/){name}(?: .*?|)%}}", src):
return False
if regex := self.AMBIGUOUS_BLOCK_TAGS.get(name):
if regex[0]:
diff --git a/tests/suite/django.html b/tests/suite/django.html
index 6f6cab7..bea3af6 100644
--- a/tests/suite/django.html
+++ b/tests/suite/django.html
@@ -184,3 +184,14 @@
Welcome, {{ request.user }}
This component is intentionally repeated.
{% /quote_text %}
{% /quote %}
+
+
+
+{% custom_tag %}
+
+{% end_custom_tag %}
+
+
+{% customtag %}
+
+{% endcustomtag %}
diff --git a/tests/suite/django.tokens b/tests/suite/django.tokens
index 94af570..21112ac 100644
--- a/tests/suite/django.tokens
+++ b/tests/suite/django.tokens
@@ -184,4 +184,15 @@ Line([Text(' ', mode=DjHTML), Open('{% #quote_text %}', mode=DjTXT, level=1)]
Line([Text(' This component is intentionally repeated.', mode=DjHTML)], level=2)
Line([Text(' ', mode=DjHTML), Close('{% /quote_text %}', mode=DjTXT)], level=1)
Line([Close('{% /quote %}', mode=DjTXT)])
+Line([])
+Line([])
+Line([Open('', mode=DjHTML, ignore=True)], ignore=True)
+Line([Open('{% custom_tag %}', mode=DjTXT)])
+Line([Text(' ', mode=DjHTML), Text('<', mode=DjHTML), Text('div', mode=InsideHTMLTag, absolute=5), Open('>', mode=DjHTML, level=1), Close('', mode=DjHTML)], level=1)
+Line([Close('{% end_custom_tag %}', mode=DjTXT)])
+Line([])
+Line([Open('', mode=DjHTML, ignore=True)], ignore=True)
+Line([Open('{% customtag %}', mode=DjTXT)])
+Line([Text(' ', mode=DjHTML), Text('<', mode=DjHTML), Text('div', mode=InsideHTMLTag, absolute=5), Open('>', mode=DjHTML, level=1), Close('', mode=DjHTML)], level=1)
+Line([Close('{% endcustomtag %}', mode=DjTXT)])
Line([])
\ No newline at end of file