diff --git a/src/OpenFOAM/primitives/strings/word/wordIO.C b/src/OpenFOAM/primitives/strings/word/wordIO.C
index 03e46193ca69ebb23483e10041003fb67025dd79..060b871d3b7d27f90f9541e31d440efa6d8f99ee 100644
--- a/src/OpenFOAM/primitives/strings/word/wordIO.C
+++ b/src/OpenFOAM/primitives/strings/word/wordIO.C
@@ -48,15 +48,16 @@ Foam::Istream& Foam::operator>>(Istream& is, word& val)
     {
         val = tok.wordToken();
     }
-    else if (tok.isQuotedString())
+    else if (tok.isQuotedString() || tok.isVariable())
     {
-        // Try a bit harder and convert string to word
-        val = tok.stringToken();
-        const auto oldLen = val.length();
-        string::stripInvalid<word>(val);
+        // Try a bit harder, convert some string types to word
+        // - accept "quoted" or $tag, but not verbatim/expression
+
+        const auto& str = tok.stringToken();
+        val = word::validate(str);
 
         // Flag empty strings and bad chars as an error
-        if (val.empty() || val.length() != oldLen)
+        if (val.empty() || val.length() != str.length())
         {
             FatalIOErrorInFunction(is)
                 << "Empty word or non-word characters "