diff --git a/changelogs/unreleased/only-yield-valid-reference-matches.yml b/changelogs/unreleased/only-yield-valid-reference-matches.yml
new file mode 100644
index 0000000000000000000000000000000000000000..95da3cc56fd9323f9c872c26246fd22ea19687e6
--- /dev/null
+++ b/changelogs/unreleased/only-yield-valid-reference-matches.yml
@@ -0,0 +1,4 @@
+---
+title: Only yield valid references in ReferenceFilter.references_in
+merge_request:
+author:
diff --git a/lib/banzai/filter/abstract_reference_filter.rb b/lib/banzai/filter/abstract_reference_filter.rb
index 955d857c67996e9a08b48bcf26cc7a0dd3ecd211..3b15ff6566fc72293977d2f22b788ed0d02f47ad 100644
--- a/lib/banzai/filter/abstract_reference_filter.rb
+++ b/lib/banzai/filter/abstract_reference_filter.rb
@@ -33,7 +33,12 @@ module Banzai
       # Returns a String replaced with the return of the block.
       def self.references_in(text, pattern = object_class.reference_pattern)
         text.gsub(pattern) do |match|
-          yield match, $~[object_sym].to_i, $~[:project], $~[:namespace], $~
+          symbol = $~[object_sym]
+          if object_class.reference_valid?(symbol)
+            yield match, symbol.to_i, $~[:project], $~[:namespace], $~
+          else
+            match
+          end
         end
       end
 
diff --git a/spec/lib/banzai/filter/issue_reference_filter_spec.rb b/spec/lib/banzai/filter/issue_reference_filter_spec.rb
index 456dbac0698ffa2e61ef979654f0ffc2b43b4235..11607d4fb26916da7327dfc11048b91739adbcdf 100644
--- a/spec/lib/banzai/filter/issue_reference_filter_spec.rb
+++ b/spec/lib/banzai/filter/issue_reference_filter_spec.rb
@@ -311,7 +311,7 @@ describe Banzai::Filter::IssueReferenceFilter, lib: true do
     end
   end
 
-  describe '#issues_per_Project' do
+  describe '#issues_per_project' do
     context 'using an internal issue tracker' do
       it 'returns a Hash containing the issues per project' do
         doc = Nokogiri::HTML.fragment('')
@@ -346,4 +346,26 @@ describe Banzai::Filter::IssueReferenceFilter, lib: true do
       end
     end
   end
+
+  describe '.references_in' do
+    let(:merge_request)  { create(:merge_request) }
+
+    it 'yields valid references' do
+      expect do |b|
+        described_class.references_in(issue.to_reference, &b)
+      end.to yield_with_args(issue.to_reference, issue.iid, nil, nil, MatchData)
+    end
+
+    it "doesn't yield invalid references" do
+      expect do |b|
+        described_class.references_in('#0', &b)
+      end.not_to yield_control
+    end
+
+    it "doesn't yield unsupported references" do
+      expect do |b|
+        described_class.references_in(merge_request.to_reference, &b)
+      end.not_to yield_control
+    end
+  end
 end