I would do something like this,

1. create a helper function to generate your query terms from the text-string input. You could inline this into the function, but it's ugly and silly and if you need it here then you probably need it elsewhere.
2. Write a query with `NOT word LIKE ANY()`

Here is a demo of the helper function,

    CREATE OR REPLACE FUNCTION my_stupid_query(q text)
    RETURNS text[] AS $$
    
      SELECT ARRAY(
        SELECT regexp_replace(t, '[^[:alpha:]]', '_', 'g')
        FROM unnest(string_to_array(q, ' ')) AS q(t)
      );
    
    $$ LANGUAGE sql
    IMMUTABLE;


Then you can use `NOT word LIKE ANY()`. This shows what it would look like,

    SELECT word
    FROM (VALUES (ARRAY['hello world', 'foo', 'bar'])) AS t1(x)
    CROSS JOIN LATERAL unnest(x) AS t2(word)
    WHERE NOT word LIKE ANY(my_stupid_query('foo hello-world helloXworld'));

     word 
    ------
     bar
    (1 row)