If they were just spaces, it would be a case of
$partes = explode( ' ', $todo );
One solution, depending on what you want, would be to force a space before the characters you want to treat as isolates:
$todo = str_replace( array( '.', ',' ,'?' ), array( ' .', ' ,', ' ?'), $todo );
$partes = explode( ' ', $todo );
See working at IDEONE .
Note that I've placed valid separators directly in replace, but if you want to do this with a series of characters, it makes up for a more complex function.
If you prefer to consider all of the alphanumeric characters separated from the symbols, you can use a RegEx , and solve on one line:
preg_match_all('~\w+|[^\s\w]+~u', $todo, $partes );
See working at IDEONE .
In addition, it would be the case to add spaces before and after the symbols, remove double spaces, depends on the criteria. The intention of the response was to take an initial turn.