puoi crearti una funzione

codice:
/**
 * Controlla se in una stringa sono presenti determinati caratteri speciali
 * @param string $stringa
 * @return boolean
 */
function checkCaratteri($stringa){

  // array con l'ascii dei caratteri speciali
  $cs = array();

  // inserisco i codici ascii da 33 a 47
  for($i=33;$i<=47;$i++){
      $cs[] = $i;
  }

  // variabile per stabilire se i caratteri speciali sono presenti
  $presenti = false;

  // ciclo la stringa 
  for($i=0; $i<strlen($stringa);$i++){

      // ascii del carattere nella posizione $i
      $ascii = ord($stringa[$i]);

      // controllo se ascii si trova nell'array con i caratteri speciali
      if(in_array($ascii, $cs)){
          $presenti = true;
          // se è presente un solo carattere è inutile continuare il ciclo quidi esco
          break;
      }
  }

  // ritorno se sono presenti oppure non
  return $presenti;
  
}
Nell'array $cs puoi inserire anche altri caratteri speciali (devi inserire il codice ascii del carattere speciale), basta fare $cs = ord('@'); ad esempio oppure puoi inserire direttamente il codice ascii così: $cs[] = 45;

Così puoi aggiungere qualsiasi carattere speciale tu voglia.

Per i codici ascii --> http://www.asciitable.it/ascii.asp

Così se controlli cosa ti ritorna puoi vedere se sono o non sono presenti caratteri speciali

codice:
// controllo
if(checkCaratteri('#!stringaditest!#)){
    echo 'presenti';
}
else{
    echo 'non presenti';
}

// così stamperà 'presenti'
Saluti!