Since you are already using PCRE, why not convert your first not saving group into a lookbehind assertion so it is not included on the match?
'(?<=id=")[^"]+'
Since you are already using PCRE, why not convert your first not saving group into a lookbehind assertion so it is not included on the match?
'(?<=id=")[^"]+'