The 'v' problem would be because PHP doesn't recognise \v as a single character (it's supposed to mean "vertical tab"). So the sequence gets recognised as a literal "backslash-v" sequence, and hence those two characters are treated by the test the same way as it treats spaces, tabs, and so on.
For the reliability of the test, it's not very robust; for example, it doesn't check that the attribute value ends with the same character that it starts with, nor does it check that the href attribute even has a value.
Finally, I prefer PCRE-based solutions anyway, as the syntax gives more accessible control!
preg_match('/href\\s*=\\s*(?:(\\'")(.*?)\\\\1|()([^>\\s]+)?)/i', $tag, $regs);
The () is a hack to ensure that whether the attribute's value is quoted or not, the matched value itself will be in $regs[2] (if there is a quote, it will be in $regs[1], if there isn't $regs[1] will contain the empty string matched by ()).
Needless to say, that doesn't do anything to determine whether or not the value is a URL of any sort or not, but that of course would be better done separately.