Я хочу захватить шаблон вверх, но не включая первый экземпляр дополнительного шаблона с 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;