preg_replace("/([^\"])(hoge)([^\"])/","\\1foo\\3",$str)
タグの中がちゃんとクォートされてるならこれだけでいいんだけどね