$re = '/^yahoo\.com?(?:(?!\.[a-z]{2}).)*(?:.com?)?$
/mi';
$str = 'STACK ANSWER
^yahoo\\.com?(?:(?!\\.[a-z]{2}).)*(?:.com?)?$
?: NON CAPTURING GROUP - uses this to match but doesn\'t include
?! NEGATIVE LOOKAHEAD - use this to look ahead to anything dot (2 chars) dot (IE .fr.)
. ANY CHARACTER
* UNLIMITED # TIMES
?: use this to match : .com? (m is optional) (expression is optional)
$ ends
com.fr (followed by anything)*
with optional .co OR .com
.co.kr
KEEP
yahoo.es
yahoo.fr
yahoo.ca
yahoo.cm
yahoo.cn
yahoo.tw
yahoo.co.jp
yahoo.co.kr
yahoo.co.uk
yahoo.com.cn
yahoo.com.hk
yahoo.com.mx
yahoo.com.tw
REPLACE
yah.com
yahaoo.com
yahho.com
yahhoo.com
yaho.com
yahoo
yahoo,com
yahoo.c
yahoo.co
yahoo.co,
yahoo.com
yahoo.com,
yahoo.com.
yahoo.com\'
yahoo.com/haltokariev
yahoo.com>
yahoo.com21yahoo.com
yahoo.comcom
yahoo.comheatdoc1123
yahoo.comj
yahoo.comm
yahoo.comn
yahoo.comok.nicholastrami9-12-15
yahoo.comom
yahoo.comy.net
yahoo.con
yahoo.coom
yahoo.copm
yahoo.cvom
yahoo.net
yahoo.ocm
yahoo.om
yahooc.om
yahoocom
yahoogroups.com
yahool.com
yahoomail.com
yahooo.com
';
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