Home > database >  String to URL but detect if url is image?
String to URL but detect if url is image?

Time:12-02

i'm trying to do something in PHP

I'm trying to get the link of an image -> store it to my DB, but I'd like the user to be able to store text before it, and after it, I've gotten my hands on a similar function for links, but the image part is missing.

As you can see the turnUrlIntoHyperlink does a regex check over the entire arg passed, turning the text that contains it to the url, so users can post something like Hey check this cool site "https://stackoverflow.com" its dope! And the entire argument posting to my database.

However i can't seem to get the same function working for the Convert Image, as it simply won't post and removed text before/after it before when i made the attempt.

How would i do this in a correct way, and can i combine these 2 functions in to 1 function?

function convertImg($string) {
    return preg_replace('/((https?):\/\/(\S*)\.(jpg|gif|png)(\?(\S*))?(?=\s|$|\pP))/i', '<img src="$1" />', $string);
}

function turnUrlIntoHyperlink($string){
    //The Regular Expression filter
    $reg_exUrl = "/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-] [.][a-z]{2,4}\/)(?:[^\s()<>] |\(([^\s()<>] |(\([^\s()<>] \)))*\)) (?:\(([^\s()<>] |(\([^\s()<>] \)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))/";
    
    // Check if there is a url in the text
    if(preg_match_all($reg_exUrl, $string, $url)) {

        // Loop through all matches
        foreach($url[0] as $newLinks){
            if(strstr( $newLinks, ":" ) === false){
                $link = 'http://'.$newLinks;
            }else{
                $link = $newLinks;
            }

            // Create Search and Replace strings
            $search  = $newLinks;
            $replace = '<a href="'.$link.'" title="'.$newLinks.'" target="_blank">'.$link.'</a>';
            $string = str_replace($search, $replace, $string);
        }
    }

    //Return result
    return $string;
}

more explained in detail : When i post a link like https://google.com/ I'd like it to be a href, But if i post an image like https://image.shutterstock.com/image-photo/duck-on-white-background-260nw-1037486431.jpg , i'd like it to be a img src,

Currently, i'm storing it in my db and echoing it to a little debug panel,

CodePudding user response:

Do you mean that you want to make an <img> inside <a> element?

Your turnUrlIntoHyperlink function have captured the url successfully, so we can just use explode to get string before and after the link.

        $exploded = explode($link, $string);
        $string_before = $exploded[0];
        $string_after = $exploded[1];

Code example:

<?php

function turnUrlIntoHyperlink($string){
    //The Regular Expression filter
    $reg_exUrl = "/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-] [.][a-z]{2,4}\/)(?:[^\s()<>] |\(([^\s()<>] |(\([^\s()<>] \)))*\)) (?:\(([^\s()<>] |(\([^\s()<>] \)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))/";
    
    // Check if there is a url in the text
    if(preg_match_all($reg_exUrl, $string, $url)) {

        // add http protocol if the url does not already contain it
        $newLinks = $url[0][0];
        if(strstr( $newLinks, ":" ) === false){
            $link = 'http://'.$newLinks;
        }else{
            $link = $newLinks;
        }

        $exploded = explode($link, $string);
        $string_before = $exploded[0];
        $string_after = $exploded[1];

        return $string_before.'<a href="'.$link.'" title="'.$newLinks.'" target="_blank"><img src="'.$link.'"></a>'.$string_after;

    }
    return $string;
}

echo turnUrlIntoHyperlink('Hey check this cool site https://stackoverflow.com/img/myimage.png its dope!');

Output:

Hey check this cool site <a href="https://stackoverflow.com/img/myimage.png" title="https://stackoverflow.com/img/myimage.png" target="_blank"><img src="https://stackoverflow.com/img/myimage.png"></a> its dope!

Edit: the question has been edited

Since an image URL is just another kind of link/URL, your logic should go like this pseudocode:

if link is image and link is url
  print <img src=link> tag
else if link is url and link is not image
  print <a href=link> tag
else
  print link

So you can just write a new function to "merge" those two function:

function convertToImgOrHyperlink($string) {
    $result = convertImg($string);
    if($result != $string) return $result;

    $result = turnUrlIntoHyperlink($string);
    if($result != $string) return $result;

    return $string;
}


echo convertToImgOrHyperlink('Hey check this cool site https://stackoverflow.com/img/myimage.png its dope!');
echo "\r\n\r\n";
echo convertToImgOrHyperlink('Hey check this cool site https://stackoverflow.com/ its dope!');
echo "\r\n\r\n";

Output:

Hey check this cool site <img src="https://stackoverflow.com/img/myimage.png" /> its dope!

Hey check this cool site <a href="https://stackoverflow.com/" title="https://stackoverflow.com/" target="_blank">https://stackoverflow.com/</a> its dope!


The basic idea is that since image url is also a link, such check must be done first. Then if it's effective (input and return is different), then do <img> convertion. Otherwise do <a> convertion.

  •  Tags:  
  • php
  • Related