Try this:
// bad form to use $string
$text = "this contains some text and a special keyword that is 'SPECIAL KEY!'. More text, more text, more text!! Yay!
this is a second paragraph that contains the same special key! but in lower case. I also want this entire paragraph as a result.
this paragraph doesnt have any key that is special, so it should be discarded.
";
$matches = array();
preg_match_all('/^.*?special key.*?$/imU', $text, $matches);
print '<pre>' . print_r($matches, true) . '</pre>';
My results:
[0] => Array
(
[0] => this contains some text and a special keyword that is 'SPECIAL KEY!'. More text, more text, more text!! Yay!
[1] => this is a second paragraph that contains the same special key! but in lower case. I also want this entire paragraph as a result.
)