diff --git a/code/model/SiteTreeLinkTracking.php b/code/model/SiteTreeLinkTracking.php
index fead777c..9e3638e1 100644
--- a/code/model/SiteTreeLinkTracking.php
+++ b/code/model/SiteTreeLinkTracking.php
@@ -217,14 +217,18 @@ class SiteTreeLinkTracking_Parser {
$matches = array();
if(preg_match('/\[sitetree_link(?:\s*|%20|,)?id=([0-9]+)\](#(.*))?/i', $href, $matches)) {
$page = DataObject::get_by_id('SiteTree', $matches[1]);
+ $broken = false;
+
if (!$page) {
// Page doesn't exist.
$broken = true;
- } else if (!empty($matches[3]) && !preg_match("/(name|id)=\"{$matches[3]}\"/", $page->Content)) {
- // Broken anchor on the target page.
- $broken = true;
- } else {
- $broken = false;
+ } else if (!empty($matches[3])) {
+ $anchor = preg_quote($matches[3], '/');
+
+ if (!preg_match("/(name|id)=\"{$anchor}\"/", $page->Content)) {
+ // Broken anchor on the target page.
+ $broken = true;
+ }
}
$results[] = array(
diff --git a/tests/model/SiteTreeLinkTrackingTest.php b/tests/model/SiteTreeLinkTrackingTest.php
index 98ccb71f..e5967631 100644
--- a/tests/model/SiteTreeLinkTrackingTest.php
+++ b/tests/model/SiteTreeLinkTrackingTest.php
@@ -32,6 +32,7 @@ class SiteTreeLinkTrackingTest extends SapphireTest {
$this->assertFalse($this->isBroken("ID]#yes-name-anchor\">link"));
$this->assertFalse($this->isBroken("ID]#yes-id-anchor\">link"));
$this->assertFalse($this->isBroken("ID]\">link"));
+ $this->assertTrue($this->isBroken("ID]#http://invalid-anchor.com\">"));
}
function highlight($content) {