Skip to main content

replace relative URLs with absolute URLs

Like heading sais, our task is to replace relative URLs in HTML string with absolute URLs. We are using Java and regular expressions to solve this task.

First we create a regular expression to find URLs we want to update

(href=)("|')([^http].*?)("|')


What it does? It tries to match all "href" attributes which are not starting with "http". It groups a match into groups. First part is attribute name with equal sign ("href="), then quotes (both single and double quotes could be used), then value of attribute and then again quotes.

Next we have to create Java code to use given reg. expression.

String replaceRelativeLinksWithAbsolute(String html, String url) {
    Pattern p = Pattern.compile("(href=)(\"|')([^http].*?)(\"|')");
    Matcher m = p.matcher(html);

    StringBuffer sb = new StringBuffer();

    boolean result = m.find();

    while (result) {
        m.appendReplacement(sb, createReplacement(url, m));
        result = m.find();
    }

    m.appendTail(sb);

    return sb.toString();
}

String createReplacement(String url, MatchResult m) {
    StringBuilder r = new StringBuilder();

    if (m.groupCount() == 4) {
        r.append(m.group(1)); // href=
        r.append(m.group(2)); // quote
        r.append(url);        // absolute path (domain)
        r.append(m.group(3)); // existing relative path
        r.append(m.group(4)); // quote
    }

    return r.toString();
}

// TODO: anchors? "href"-s starting with symbol "#"? javascript?
(reg. exp. needs to be updated to avoid changing links like this)

Comments

Popular posts from this blog

How to run Laravel and Angular app on the same development host?

I had to build a quick demo using Angular . I decided to use Laravel as back end for my app. Setup Setup went easy. I used  angular2-seed for Angular. Cloned it using git. $ git clone https://github.com/angular/angular2-seed.git my-demo-app-gui With command "npm start" after "npm install" in the "my-demo-app-gui" folder I got my angular application running locally - http://localhost:3000. To create a new Laravel project I used following command line command: "laravel new my-demo-app-web" to create PHP server side for my project. In folder I just created, I executed following command: "php -S localhost:8000 -t public" to start local back end server -  http://localhost:8000. So far everything went smoothly. So I started build something amazing, like script of Laravel is suggesting before it is finishing its job. Since the goal for me was to build a web application that will get its data from the back end of the same hos

brew, "pear install ...", Log for example..

I had issues while installing Log package from Pear. I used brew to get PHP (5.5.17) running on my MBP. So, back to the installing issue - if I tried to execute following command I got an error .. $ pear install Log No releases available for package "pear.php.net/Log" intallation failed So, failed. Then I tried to download the package using "pear download Log". Failed too. Solution was to go to Log package Pear page  and manually download the package. And in terminal you should executed the same installation command and point to downloaded file.. $ pear install /path/to/downloaded/Log-1.12.8.tar .. output skipped .. install ok: channel://pear.php.net/Log-1.12.8 Done. Anyway, there are probably other (better, more modern) logging libraries out there for PHP applications. Feel free to post your favorite one with short description to comments. Thanks in advance!