xsl-list
[Top] [All Lists]

Re: [xsl] Escaping special characters for *nix file path

2012-07-29 08:58:22
Hmm, I'm not sure you are done yet. If you are passing the escaped
pathname to a shell you might have to guard against more magic
characters. Try these:

touch a.txt b.txt
ls x[12].txt
ls x{1,2}.txt
ls x?.txt
ls x*.txt

A relatively safe way would be to enclose the path name in apostrophes
(') and escape all contained apostrophes and backslashes with a
backslash.

-W





On 29/07/2012, Lighton Phiri <lighton(_dot_)phiri(_at_)gmail(_dot_)com> wrote:
Great! Thank you.I guess all I needed to do was revise my regular
expression skills. I eventually settled for the expression below. I
couldn't quite figure out how to put the single quote with the second
group and so I just use an extra replace function.

replace(replace($filename,&quot;'&quot;,&quot;\\'&quot;),
'(&quot;|\(|\)|\[|\]|\s+)', '\\$1')

Lighton Phiri
http://lightonphiri.org


On 29 July 2012 14:53, Liam R E Quin <liam(_at_)w3(_dot_)org> wrote:
On Sun, 2012-07-29 at 06:30 +0200, Lighton Phiri wrote:

Yes they are allowed, but special characters need to be escaped for
one to access a file path.
[..]
phiri@PHRLIG001:~$ touch ../data/Sites/3218AD Eland\'s
Bay/Bobbejaansberg/BB15/testFile.txt
touch: cannot touch `Bay/Bobbejaansberg/BB15/testFile.txt': No such
file or directory

This is because the shell splits arguments at spaces, so you actually
gave the touch command two filenames. If you used quotes
$ touch "../data/Sites/3218AD Eland's
Bay/Bobbejaansberg/BB15/testFile.txt"

then it would work fine.

It is not necessary to escape characters from the shell inside an XSLT
stylsheet, because the shell isn't involved.

[...]

replace($filename, "[ '\\`&;]", "\\&")
will probably do what you want.
Or use \s instead of space if there might be newlines.
You might also need to replace " with \"

I am getting an error when I try what you suggested.

<xsl:value-of select="{replace($filename, "[ '\\`&;]", "\\&")}" />

You don't want the curly braces there - value-of is expecting an
expression, not a string.

[...]

My file paths have special characters in them and those characters
include 'square brackets', 'parentheses', 'ampersands', etc. all of
which are interpreted differently by the regular expression given by
second argument of replace function.

That doesn't matter.

Actually what I tend to do myself is something like
   replace($filename, "[^a-zA-Z0-9]+", "-")
to turn any sequence of characters other than letters or digits into a
hyphen. If it's a path rather than a filename, include / after the 9
there. But if the data is untrusted you should not normally allow /
inside it.

Finally, as Mike Kay implied in a separate message, you probably want
\$0 as the replacement, not \& (I use too many regular expression
libraries, sorry)

Liam

--
Liam Quin - XML Activity Lead, W3C, http://www.w3.org/People/Quin/
Pictures from old books: http://fromoldbooks.org/
Ankh: irc.sorcery.net irc.gnome.org freenode/#xml


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--