79 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Services;
 | |
| 
 | |
| class DockerImageParser
 | |
| {
 | |
|     private string $registryUrl = '';
 | |
| 
 | |
|     private string $imageName = '';
 | |
| 
 | |
|     private string $tag = 'latest';
 | |
| 
 | |
|     public function parse(string $imageString): self
 | |
|     {
 | |
|         // First split by : to handle the tag, but be careful with registry ports
 | |
|         $lastColon = strrpos($imageString, ':');
 | |
|         $hasSlash = str_contains($imageString, '/');
 | |
| 
 | |
|         // If the last colon appears after the last slash, it's a tag
 | |
|         // Otherwise it might be a port in the registry URL
 | |
|         if ($lastColon !== false && (! $hasSlash || $lastColon > strrpos($imageString, '/'))) {
 | |
|             $mainPart = substr($imageString, 0, $lastColon);
 | |
|             $this->tag = substr($imageString, $lastColon + 1);
 | |
|         } else {
 | |
|             $mainPart = $imageString;
 | |
|             $this->tag = 'latest';
 | |
|         }
 | |
| 
 | |
|         // Split the main part by / to handle registry and image name
 | |
|         $pathParts = explode('/', $mainPart);
 | |
| 
 | |
|         // If we have more than one part and the first part contains a dot or colon
 | |
|         // it's likely a registry URL
 | |
|         if (count($pathParts) > 1 && (str_contains($pathParts[0], '.') || str_contains($pathParts[0], ':'))) {
 | |
|             $this->registryUrl = array_shift($pathParts);
 | |
|             $this->imageName = implode('/', $pathParts);
 | |
|         } else {
 | |
|             $this->imageName = $mainPart;
 | |
|         }
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     public function getFullImageNameWithoutTag(): string
 | |
|     {
 | |
|         if ($this->registryUrl) {
 | |
|             return $this->registryUrl.'/'.$this->imageName;
 | |
|         }
 | |
| 
 | |
|         return $this->imageName;
 | |
|     }
 | |
| 
 | |
|     public function getRegistryUrl(): string
 | |
|     {
 | |
|         return $this->registryUrl;
 | |
|     }
 | |
| 
 | |
|     public function getImageName(): string
 | |
|     {
 | |
|         return $this->imageName;
 | |
|     }
 | |
| 
 | |
|     public function getTag(): string
 | |
|     {
 | |
|         return $this->tag;
 | |
|     }
 | |
| 
 | |
|     public function toString(): string
 | |
|     {
 | |
|         $parts = [];
 | |
|         if ($this->registryUrl) {
 | |
|             $parts[] = $this->registryUrl;
 | |
|         }
 | |
|         $parts[] = $this->imageName;
 | |
| 
 | |
|         return implode('/', $parts).':'.$this->tag;
 | |
|     }
 | |
| }
 |