Using slashes in drupal path parameters
There's one additional trick additionally to the options that you already listed. If you look at search_menu(), you can see that it uses a named placeholder called %menu_tail and this: 'load arguments' =&gt; array('%map', '%index'),.

This does exactly what the name suggests. It calls menu_tail_load() (and passed it's own index/position to it as a load argument), which doesn't actually load anything but takes all additional path elements including it's own position,  and returns them as a single argument.

Obviously, this only works for the last argument. If you have multiple arguments like this, use GET/POST variables or escape them.