PHP's realpath in JavaScript

How to use

You you can install via yarn add locutus and require this function via const realpath = require('locutus/php/filesystem/realpath').

It is important to use a bundler that supports tree-shaking so that you only ship the functions that you actually use to your browser, instead of all of Locutus, which is massive. Examples are: Parcel, webpack, or rollup.js. For server-side use this is typically less of a concern.

Examples

Please note that these examples are distilled from test cases that automatically verify our functions still work correctly. This could explain some quirky ones.

#codeexpected result
1realpath('some/dir/.././_supporters/pj_test_supportfile_1.htm')'some/_supporters/pj_test_supportfile_1.htm'

Notes

Here’s what our current JavaScript equivalent to PHP's realpath looks like.

module.exports = function realpath(path) {
// discuss at: https://locutus.io/php/realpath/
// original by: mk.keck
// improved by: Kevin van Zonneveld (https://kvz.io)
// note 1: Returned path is an url like e.g. 'https://yourhost.tld/path/'
// example 1: realpath('some/dir/.././_supporters/pj_test_supportfile_1.htm')
// returns 1: 'some/_supporters/pj_test_supportfile_1.htm'

if (typeof window === 'undefined') {
const nodePath = require('path')
return nodePath.normalize(path)
}

let p = 0
let arr = [] // Save the root, if not given
const r = this.window.location.href // Avoid input failures

// Check if there's a port in path (like 'https://')
path = (path + '').replace('\\', '/')
if (path.indexOf('://') !== -1) {
p = 1
}

// Ok, there's not a port in path, so let's take the root
if (!p) {
path = r.substring(0, r.lastIndexOf('/') + 1) + path
}

// Explode the given path into it's parts
arr = path.split('/') // The path is an array now
path = [] // Foreach part make a check
for (const k in arr) {
// This is'nt really interesting
if (arr[k] === '.') {
continue
}
// This reduces the realpath
if (arr[k] === '..') {
/* But only if there more than 3 parts in the path-array.
* The first three parts are for the uri */
if (path.length > 3) {
path.pop()
}
} else {
// This adds parts to the realpath
// But only if the part is not empty or the uri
// (the first three parts ar needed) was not
// saved
if (path.length < 2 || arr[k] !== '') {
path.push(arr[k])
}
}
}

// Returns the absloute path as a string
return path.join('/')
}

A community effort

Not unlike Wikipedia, Locutus is an ongoing community effort. Our philosophy follows The McDonald’s Theory. This means that we assimilate first iterations with imperfections, hoping for others to take issue with-and improve them. This unorthodox approach has worked very well to foster fun and fruitful collaboration, but please be reminded to use our creations at your own risk. THE SOFTWARE IS PROVIDED "AS IS" has never been more true than for Locutus.

Now go and: [ View on GitHub | Edit on GitHub | View Raw ]


« More PHP filesystem functions


Star