This is very similar to the question in http://regexadvice.com/forums/thread/43567.aspx and the responses there may well apply here.
Based on that, I can think of two approaches, depending on the context of the text and what is really 'valid'. Firstly, you can extract the value of the 'content' attribute and you can then process it separately. For this the pattern:
<meta(\s*(content=(['"])(((?!\3).)*)\3|[\w-]+(\s*=\s*\S*)?))+\s*/?>
will give you the value in match group #4.
Second, if the 'content=' attribute is always followed by any text followed by a semi-colon and the value you want extends fom after the semi-colon to the end of the quoted string, then:
<meta((?!content=).)*content=(["'])[^;]*;url=(((?!\2).)*)\2
will give you just the URL text value in match group #3. In this case, the search will stop when the 'content=' attribute is found, whereas the first option will find ALL attribute/value pairs and extract the value from the one you want.
By the way, I've used the 'ignore case' option for both of these patterns.
You can simplify these patterns a bit of you can accept a quoted string that might start with a single-quote and end with a double-quote (or vice-versa), then the second pattern can become:
<meta((?!content=).)*content=["'][^;]*;url=([^'"]*)["']
and the text you want will be in match group #2.
Susan