For example,the regex below will cause failure reporting lookbehind assertion is not fixed length:
#(?<!(?:(?:src)|(?:href))=["\']?)((?:https?|ftp)://[^\s\'"<>()]+)#S
Such kind of restriction doesn't exist for lookahead.
For example,the regex below will cause failure reporting lookbehind assertion is not fixed length:
#(?<!(?:(?:src)|(?:href))=["\']?)((?:https?|ftp)://[^\s\'"<>()]+)#S
Such kind of restriction doesn't exist for lookahead.
PCRE doesn't support floating lookbehind because it can cause major performance problems. This is because of the lack of right-to-left matching capability: PCRE can start a branch only from a fixed left, but left of a variable-length lookbehind can not be fixed.
Generally, try to branch your lookbehind part to fixed length patterns if possible. For example instead of:
(?<=(src|href)=")etc.
(1) use this:
(?:(?<=src=")|(?<=href="))etc.
(2) Or with \K:
(src|href)="\Ketc.
Note that \K is not a real lookbehind, because it always starts search at the end of previous match (no potential backstep into the previous match).
(3) In some complex lookbehind-only cases you can search with an "inverted" lookahead expression in a reversed string. Not too elegant but it works:
.cte(?="=(ferh|crs))