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

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!

how to ignore files and folders in subversion?

I always forget how to ignore files and folder if I'm adding subversion support to a project. Why do I need it? For example, I do not want to add log files or customer related content (uploaded files etc.) into repository. It's quite simple. In command line type following command: svn propedit svn:ignore ./path/to/folder It's not end of process. With this command you set up ignore property for given path / folder. It will open a text editor, where you can specify what exactly should be ignored. With a * it will ignore all files and subfolder under specified folder. It is possible to describe multiple patterns, just like that.. *.log *.class tmp_files.* Go ahead and try it out!