diff --git a/src/FeedIo/Feed/Node.php b/src/FeedIo/Feed/Node.php index e29ab31..57645f6 100644 --- a/src/FeedIo/Feed/Node.php +++ b/src/FeedIo/Feed/Node.php @@ -152,29 +152,43 @@ protected function setHost(string $link = null): void protected function setHostInContent(string $host = null): void { - if (property_exists($this, 'content')){ - if (!is_null($host) && !is_null($this->content)) { - $this->content = preg_replace('!(<*\s*[^>]*)(href=)(.?)(\/[^\/])!','\1 href=\3'.$host.'\4', $this->content ); - $this->content = preg_replace('!(<*\s*[^>]*)(src=)(.?)(\/[^\/])!','\1 src=\3'.$host.'\4', $this->content ); - } + if (is_null($host)) { + return; } - if (property_exists($this, 'description')){ - if (!is_null($host) && !is_null($this->description)) { - $this->description = preg_replace('!(<*\s*[^>]*)(href=)(.?)(\/[^\/])!','\1 href=\3'.$host.'\4', $this->description ); - $this->description = preg_replace('!(<*\s*[^>]*)(src=)(.?)(\/[^\/])!','\1 src=\3'.$host.'\4', $this->description ); - } + // Replaced links like href="/aaa/bbb.xxx" + $pattern = '(<\s*[^>]*)(href=|src=)(.?)(\/[^\/])(?!(.(?!)'; + $this->pregReplaceInProperty('content', $pattern, '\1\2\3'.$host.'\4'); + $this->pregReplaceInProperty('description', $pattern, '\1\2\3'.$host.'\4'); + + $itemFullLink = $this->getLink(); + $itemLink = implode("/", array_slice(explode("/", $itemFullLink), 0, -1))."/"; + + // Replaced links like href="#aaa/bbb.xxx" + $pattern = '(<\s*[^>]*)(href=|src=)(.?)(#)(?!(.(?!)'; + $this->pregReplaceInProperty('content', $pattern, '\1\2\3'.$itemFullLink.'\4'); + $this->pregReplaceInProperty('description', $pattern, '\1\2\3'.$itemFullLink.'\4'); + + // Replaced links like href="aaa/bbb.xxx" + $pattern = '(<\s*[^>]*)(href=|src=)(.?)(\w+\b)(?![:])(?!(.(?!)'; + $this->pregReplaceInProperty('content', $pattern, '\1\2\3'.$itemLink.'\4'); + $this->pregReplaceInProperty('description', $pattern, '\1\2\3'.$itemLink.'\4'); + } + + public function pregReplaceInProperty(string $property, string $pattern, string $replacement): void + { + if (property_exists($this, $property) && !is_null($this->{$property})) { + $this->{$property} = preg_replace('~'.$pattern.'~', $replacement, $this->{$property}) ?? $this->{$property}; } } public function getHostFromLink(): ?string { - if (!is_null($this->getLink())) { - $partsUrl = parse_url($this->getLink()); - $result = $partsUrl['scheme']."://".$partsUrl['host']; - } else - $result = null; + if (is_null($this->getLink())) { + return null; + } + $partsUrl = parse_url($this->getLink()); - return $result; + return $partsUrl['scheme']."://".$partsUrl['host']; } public function getValue(string $name): ?string