Yes, it's still vulnerable to XSS. There exists many techniques that can foil this, and granted a whole lot I don't know about. One thing I'm fairly certain can be abused to circumvent this, is by sending invalid UTF-8. Which, when run through your code (or by other means) is then transformed to a valid " character. Thereby not only circumventing your efforts, but relying upon them to accomplish the XSS-attack.
Granted it takes a bit more work, but those who does these kind of things don't mind the extra work.
What you've done here is called "blacklisting", meaning that you've removed/disallowed what you think is harmful. The problem with this approach is that you have to know everything that's harmful, both now and in the future, for this to be effective. Naturally, no-one can do that.
The sibling method of this is called white-listing, in which you allow only input which you know you want. Ensuring that the room for shenanigans is as narrow as possible, and in some cases completely gone (if sufficiently small list).
However, none of these are 100% sure to to avoid XSS attacks. The only thing that can do this, is output escaping. In the case of HTML, the function to do this is htmlspecialchars()
. I recommend reading the manual for it, and pay particular care to the notes for it.