$re = '/^(?!s?([/|@#]).+?\1.*?\1.*?\1)s?([/|@#]).+?\2.*?\2[gi]?[gi]?\d?\d?$/m';
$str = 'shuuld be match:
/.//
s/.//
/.//g
/.//i
/././gi
/one-or-more/anything/
/one-or-more/anything/g/3
/one-or-more/anything/i
/one-or-more/anything/gi/99
s/one-or-more/anything/g/4
s/one-or-more/anything/i
s/one-or-more/anything/gi/54
should not be match:
/.///
s/.///
s/././/
/anything/anything/anything/anything/
s/anything/anything/anything/
s/anything/anything/anything/g
s/anything/anything/anything/i
s/anything/anything/anything/gi
/anything/anything/anything/gi
/anything/anything/anything/g
/anything/anything/anything/i';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php