Regex для захвата всего перед первой необязательной строкой

Я хочу захватить шаблон вверх, но не включая первый экземпляр дополнительного шаблона с preg_match, например:

ABCDEFGwTW$% | capture ABCD @Q%HG@H%hg afdgwsa g weg#D DEFG | capture @Q%HG@H%hg afdgwsa g weg#DD @Q%HDEFG@H%hg afdgwsa g weg#D DEFG | capture @Q%HD 

Таким образом, в приведенном выше случае захватывается что-либо перед первым экземпляром строки EFG . также, если строка EFG отсутствует, тогда я хочу захватить всю строку.

Я бы подумал, что следующее будет работать, но нет такой удачи:

 $pattern = '/(.*)(?:EFG)?/'; preg_match($pattern, 'Q$TQ@#%GEFGw35hqb', $matches); print_r($matches); //should give: 'Q$TQ@#%G' 

Вы можете использовать

 '/(.*?)(?=EFG|$)/' 

Попробуйте следующее: (.*?)(?:EFG|$)

Это будет соответствовать любому персонажу (как можно меньше), пока не найдет EFG.

Другой способ сделать это:

 $str = 'Q$TQ@#%GEFGw35hqb'; $res = preg_split('/EFG/', $str); print_r($res); 

Вы можете получить результат с гораздо меньшей путаницей:

Просто проверьте более простую версию шаблона для соответствия, а если нет, используйте исходную строку:

 <?php $match = 'Q$TQ@#%GEFGw35hqb'; if (preg_match('/^(.*)EFG/', $match, $matches)) { $match = $matches[1]; } echo $match;