title: Regex to capture everything before first optional string
body: <p>I want to capture a pattern upto but not including the first instance of an optional other pattern with preg_match, eg:</p>
  
  <pre><code>ABCDEFGwTW$%                         | capture ABCD
  @Q%HG@H%hg afdgwsa g   weg#D DEFG    | capture @Q%HG@H%hg afdgwsa g   weg#D D
  @Q%HDEFG@H%hg afdgwsa g   weg#D DEFG | capture @Q%HD
  </code></pre>
  
  <p>So in the above case anything before the first instance of the string <code>EFG</code> is captured. also, if the <code>EFG</code> string is not present then I want to capture the whole string.</p>
  
  <p>I would have thought that the following would work, but no such luck:</p>
  
  <pre><code>$pattern = '/(.*)(?:EFG)?/';
  preg_match($pattern, 'Q$TQ@#%GEFGw35hqb', $matches);
  print_r($matches);
  //should give: 'Q$TQ@#%G'
  </code></pre>