diff --git a/app/assets/javascripts/pretty-text/engines/markdown-it/helpers.js.es6 b/app/assets/javascripts/pretty-text/engines/markdown-it/helpers.js.es6
index 9c82b19ea86..dbd126fc056 100644
--- a/app/assets/javascripts/pretty-text/engines/markdown-it/helpers.js.es6
+++ b/app/assets/javascripts/pretty-text/engines/markdown-it/helpers.js.es6
@@ -17,10 +17,10 @@ export function inlineRegexRule(md, options) {
   const start = options.start.charCodeAt(0);
   const maxLength = (options.maxLength || 500) + 1;
 
-  return function(state) {
+  return function(state, silent) {
     const pos = state.pos;
 
-    if (state.src.charCodeAt(pos) !== start) {
+    if (state.src.charCodeAt(pos) !== start || silent) {
       return false;
     }
 
@@ -34,18 +34,19 @@ export function inlineRegexRule(md, options) {
 
     // skip if in a link
     if (options.skipInLink && state.tokens) {
-      let last = state.tokens[state.tokens.length-1];
-      if (last) {
-        if (last.type === 'link_open') {
+      let i;
+      for(i=state.tokens.length-1;i>=0;i--) {
+        let token = state.tokens[i];
+        let type = token.type;
+        if (type === 'link_open' || (type === 'html_inline' && token.content.substr(0,2) === "<a")) {
           return false;
         }
-        if (last.type === 'html_inline' && last.content.substr(0,2) === "<a") {
-          return false;
+        if (type.block || type === 'link_close' || (type === 'html_inline' && token.content.substr(0,3).toLowerCase() === "</a>")) {
+          break;
         }
       }
     }
 
-
     const substr = state.src.slice(pos, Math.min(pos + maxLength,state.posMax));
 
     const matches = options.matcher.exec(substr);
diff --git a/spec/components/pretty_text_spec.rb b/spec/components/pretty_text_spec.rb
index dde8589da27..8e4e959b676 100644
--- a/spec/components/pretty_text_spec.rb
+++ b/spec/components/pretty_text_spec.rb
@@ -473,7 +473,14 @@ HTML
   describe "tag and category links" do
     it "produces tag links" do
       Fabricate(:topic, {tags: [Fabricate(:tag, name: 'known')]})
-      expect(PrettyText.cook(" #unknown::tag #known::tag")).to match_html("<p> <span class=\"hashtag\">#unknown::tag</span> <a class=\"hashtag\" href=\"http://test.localhost/tags/known\">#<span>known</span></a></p>")
+
+      cooked = PrettyText.cook(" #unknown::tag #known::tag")
+
+      html = <<~HTML
+        <p> <span class=\"hashtag\">#unknown::tag</span> <a class=\"hashtag\" href=\"http://test.localhost/tags/known\">#<span>known</span></a></p>
+      HTML
+
+      expect(cooked).to match_html(html)
     end
 
     # TODO does it make sense to generate hashtags for tags that are missing in action?
@@ -527,7 +534,33 @@ HTML
 
     it "produces tag links" do
       Fabricate(:topic, {tags: [Fabricate(:tag, name: 'known')]})
-      expect(PrettyText.cook("x #unknown::tag #known::tag")).to match_html("<p>x <span class=\"hashtag\">#unknown::tag</span> <a class=\"hashtag\" href=\"http://test.localhost/tags/known\">#<span>known</span></a></p>")
+
+      cooked = PrettyText.cook(" #unknown::tag #known::tag")
+
+      html = <<~HTML
+        <p><span class=\"hashtag\">#unknown::tag</span> <a class=\"hashtag\" href=\"http://test.localhost/tags/known\">#<span>known</span></a></p>
+      HTML
+
+      expect(cooked).to eq(html.strip)
+
+      cooked = PrettyText.cook("[`a` #known::tag here](http://somesite.com)")
+
+      html = <<~HTML
+        <p><a href="http://somesite.com" rel="nofollow noopener"><code>a</code> #known::tag here</a></p>
+      HTML
+
+      expect(cooked).to eq(html.strip)
+
+      cooked = PrettyText.cook("<a href='http://somesite.com'>`a` #known::tag here</a>")
+
+      expect(cooked).to eq(html.strip)
+
+      cooked = PrettyText.cook("<A href='/a'>test</A> #known::tag")
+      html = <<~HTML
+        <p><a href="/a">test</a> <a class="hashtag" href="http://test.localhost/tags/known">#<span>known</span></a></p>
+      HTML
+
+      expect(cooked).to eq(html.strip)
     end
 
     it "can handle mixed lists" do
@@ -680,6 +713,7 @@ HTML
     end
 
     it "supports tables" do
+
       markdown = <<~MD
         | Tables        | Are           | Cool  |
         | ------------- |:-------------:| -----:|