andrewducker: (overwhelming firepower)
andrewducker ([personal profile] andrewducker) wrote2011-11-24 08:07 am

Anyone here know much about Java?

I have user input for a URL field. I want them to be able to enter anything from "http://andrewducker.wordpress.com/xmlrpc.php" to "andrewducker.wordpress.com" and be able to end up at the same end point.

I've wasted a couple of hours messing around with the various constructors for URL and not got to anywhere satisfactory, should I just do string checking and construct it myself?

I should make it clear - I always want the /xmlrpc.php bit to be what's on the end of the URL, that's a Wordpress standard, so I don't need to do any complex discovery. I just need to append that if it's not there.

I was hoping that someone would have written a class that could append bits of URLs together, but the basic stuff in the built in URL class doesn't quite cut it.
drplokta: (Default)

[personal profile] drplokta 2011-11-24 09:39 am (UTC)(link)
The regular expression should extract the actual domain name with the optional extraneous bits removed, so you can then prepend "http://" and append "/xmlrpc.php" and you're done.

[identity profile] skington.livejournal.com 2011-11-24 09:52 am (UTC)(link)
Sounds like a series of regular expressions is your best bet, then. In Perl, that would be e.g.

if ($url !~ m{^ https?:// }x) {
$url = 'http://' . $url;
}
if ($url !~ m{ /xmlrpc\.php $ }x) {
$url .= '/xmlrpc.php';
}

And then use your standard libraries to check whether that URL is valid or not. (Validation step might just be to call the resulting "url" and see if it works.)

[identity profile] pozorvlak.livejournal.com 2011-11-24 09:54 am (UTC)(link)
The https issue is easy to fix: add s? to tge regex after http. The other issue is handled already - the .* is greedy, and consumes as many characters as it can.

Of course, we're now up to two edge cases with no guarantee we've thought of them all, which is the usual weakness of regexp-based approaches.

[identity profile] pozorvlak.livejournal.com 2011-11-24 01:16 pm (UTC)(link)
Typically character-index based solutions have all of the brittleness and none of the readability of rexexp-based solutions, but in this case I think your algorithm makes sense.

[identity profile] pozorvlak.livejournal.com 2011-11-24 01:17 pm (UTC)(link)
*regexp
drplokta: (Default)

[personal profile] drplokta 2011-11-24 09:52 am (UTC)(link)
I think you'll need to add an (s)* to cope with the https possibility.

[identity profile] pozorvlak.livejournal.com 2011-11-24 09:56 am (UTC)(link)
I for one find your use of * in place of ? surprising. A hangover from pre-PCRE regexes?
drplokta: (Default)

[personal profile] drplokta 2011-11-24 10:01 am (UTC)(link)
I just simplify matters for myself by not bothering to remember what ? does unless I actually need it. In this case, it doesn't really matter if something like "http:http://" gets stripped off the beginning or "xmlrpc.phphp" gets stripped off the end, so I didn't bother. If it was important to match only a single occurrence, I'd look it up again. Yes, most of the *s can probably be ?s, except in the "(\/)*" bit where * is needed.