Re: How to escape a local path so fopen() doesn't consider it a URL?

[email protected] (Jesse Schalken)
Newsgroups php.general
Message-ID <CAF1yvAR9NdY8GF9dxP7HkDgnW+D3ocrSi=7WZg6WDRMzgJD74Q@mail.gmail.com>
On Wed, Dec 21, 2016 at 12:06 AM, Christoph M. Becker <[email protected]>
wrote:

> On 20.12.2016 at 07:58, Jesse Schalken wrote:
>
> Use an absolute path, or at least some qualification, such as
> `./data:foo`.  That is sufficient to tell PHP that you're not trying to
> access a data URL.
>
>
Thanks. I managed to find the responsible functions in PHP
(php_stream_locate_url_wrapper) and HHVM (Stream::getWrapperProtocol) and
came up with this, which seems to work:

/**
 * Make sure a path will be treated as a local file path and not as a URL
 * for some other stream wrapper.
 */
function make_path_local(string $path): string {
  // Look at php_stream_locate_url_wrapper() in PHP source
  // or Stream::getWrapperProtocol() in HHVM
  //
  // Basically, any path that matches this regex is likely to be considered
a
  // URL for another stream wrapper.
  //
  // Handily, a path that matches this regex is guaranteed not to be an
  // absolute path on POSIX or Windows, so if it matches we can safely
  // force it not to match by prefixing it with ./ on POSIX and .\ on
  // Windows.

  if (\preg_match('/^([a-zA-Z+\\-.]+:\\/\\/|data:|zlib:)/Ds', $path))
    return '.' . \DIRECTORY_SEPARATOR . $path;

  return $path;
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.