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) {