diff --git a/dnsapi/dns_selfhost.sh b/dnsapi/dns_selfhost.sh
index 47e2f24c..b4284f51 100644
--- a/dnsapi/dns_selfhost.sh
+++ b/dnsapi/dns_selfhost.sh
@@ -4,11 +4,13 @@
 #       Report Bugs here: https://github.com/Marvo2011/acme.sh/issues/1
 #	Last Edit: 17.02.2022
 
+DNS_CHALLENGE_PREFIX_ESCAPED="_acme-challenge\."
+
 dns_selfhost_add() {
-  domain=$1
+  fulldomain=$1
   txt=$2
   _info "Calling acme-dns on selfhost"
-  _debug fulldomain "$domain"
+  _debug fulldomain "$fulldomain"
   _debug txtvalue "$txt"
 
   SELFHOSTDNS_UPDATE_URL="https://selfhost.de/cgi-bin/api.pl"
@@ -31,7 +33,16 @@ dns_selfhost_add() {
     SELFHOSTDNS_LAST_SLOT=1
   fi
 
-  rid=$(echo "$SELFHOSTDNS_MAP" | grep -Eoi "$domain:(\d+)" | tr -d "$domain:")
+  # cut DNS_CHALLENGE_PREFIX_ESCAPED from fulldomain if present at the beginning of the string
+  lookupdomain=$(echo "$fulldomain" | sed "s/^$DNS_CHALLENGE_PREFIX_ESCAPED//")
+  _debug lookupdomain "$lookupdomain"
+
+  # get the RID for lookupdomain or fulldomain from SELFHOSTDNS_MAP
+  # only match full domains (at the beginning of the string or with a leading whitespace),
+  # e.g. don't match mytest.example.com or sub.test.example.com for test.example.com
+  # replace the whole string with the RID (matching group 3) for assignment
+  # if the domain is defined multiple times only the last occurance will be matched
+  rid=$(echo "$SELFHOSTDNS_MAP" | sed -E "s/(^|^.*[[:space:]])($lookupdomain:|$fulldomain:)([0-9][0-9]*)(.*)/\3/")
 
   if test -z "$rid"; then
     if [ $SELFHOSTDNS_LAST_SLOT = "2" ]; then
@@ -69,9 +80,9 @@ dns_selfhost_add() {
 }
 
 dns_selfhost_rm() {
-  domain=$1
+  fulldomain=$1
   txt=$2
-  _debug fulldomain "$domain"
+  _debug fulldomain "$fulldomain"
   _debug txtvalue "$txt"
   _info "Creating and removing of records is not supported by selfhost API, will not delete anything."
 }