Конечно, это возможно с регулярным выражением! Вы не просите соответствовать вложенным скобкам! : P
Но да, именно для этого были созданы регулярные выражения. Пример:
/\S*[^\w\s]+\S*/
Это будет соответствовать всем следующим:
@ss
as$
a$s
@$s
a$$
@s$
@$$
Будет не соответствовать этому:
ass
То, что я верю, то, что вы хотите. Как это работает:
\S*
соответствует 0 или более непробельным символам. [^\w\s]+
соответствует только символам (оно будет соответствовать всему, что не является ни словом, ни пробелом), и соответствует 1 или более из них (поэтому требуется символьный символ). Затем \S*
снова соответствует 0 или более не символы пробела (символы и буквы).
Если мне разрешат предложить лучшую стратегию, в Perl вы можете сохранить регулярное выражение в переменной. Я не знаю, можете ли вы сделать это в PHP, но если вы можете, вы можете создать список переменных, например:
$a = /[aA@]/ # regex that matches all a-like symbols
$b = /[bB]/
$c = /[cC(]/
# etc...
Или:
$regex = array( 'a' => /[aA@]/, 'b' => /[bB]/, 'c' => /[cC(]/, ... );
Таким образом, вы можете сопоставить «друга» во всех его перестановках с:
/$f$r$i$e$n$d/
Или:
/$regex['f']$regex['r']$regex['i']$regex['e']$regex['n']$regex['d']/
Конечно, второй выглядит излишне многословным, но это PHP для вас. Я думаю, что второе, вероятно, является лучшим решением, так как оно хранит их все в хэше, а не как отдельные переменные, но я признаю, что это регулярное выражение немного уродливо.