match(RegexHelper::REGEX_LINK_DESTINATION_BRACES)) { // Chop off surrounding <..>: return UrlEncoder::unescapeAndEncode( RegexHelper::unescape(\substr($res, 1, -1)) ); } if ($cursor->getCurrentCharacter() === '<') { return null; } $destination = self::manuallyParseLinkDestination($cursor); if ($destination === null) { return null; } return UrlEncoder::unescapeAndEncode( RegexHelper::unescape($destination) ); } public static function parseLinkLabel(Cursor $cursor): int { $match = $cursor->match('/^\[(?:[^\\\\\[\]]|\\\\.){0,1000}\]/'); if ($match === null) { return 0; } $length = \mb_strlen($match, 'UTF-8'); if ($length > 1001) { return 0; } return $length; } public static function parsePartialLinkLabel(Cursor $cursor): ?string { return $cursor->match('/^(?:[^\\\\\[\]]+|\\\\.?)*/'); } /** * Attempt to parse link title (sans quotes) * * @return string|null The string, or null if no match */ public static function parseLinkTitle(Cursor $cursor): ?string { if ($title = $cursor->match('/' . RegexHelper::PARTIAL_LINK_TITLE . '/')) { // Chop off quotes from title and unescape return RegexHelper::unescape(\substr($title, 1, -1)); } return null; } public static function parsePartialLinkTitle(Cursor $cursor, string $endDelimiter): ?string { $endDelimiter = \preg_quote($endDelimiter, '/'); $regex = \sprintf('/(%s|[^%s\x00])*(?:%s)?/', RegexHelper::PARTIAL_ESCAPED_CHAR, $endDelimiter, $endDelimiter); if (($partialTitle = $cursor->match($regex)) === null) { return null; } return RegexHelper::unescape($partialTitle); } private static function manuallyParseLinkDestination(Cursor $cursor): ?string { $oldPosition = $cursor->getPosition(); $oldState = $cursor->saveState(); $openParens = 0; while (($c = $cursor->getCurrentCharacter()) !== null) { if ($c === '\\' && ($peek = $cursor->peek()) !== null && RegexHelper::isEscapable($peek)) { $cursor->advanceBy(2); } elseif ($c === '(') { $cursor->advanceBy(1); $openParens++; } elseif ($c === ')') { if ($openParens < 1) { break; } $cursor->advanceBy(1); $openParens--; } elseif (\preg_match(RegexHelper::REGEX_WHITESPACE_CHAR, $c)) { break; } else { $cursor->advanceBy(1); } } if ($openParens !== 0) { return null; } if ($cursor->getPosition() === $oldPosition && (! isset($c) || $c !== ')')) { return null; } $newPos = $cursor->getPosition(); $cursor->restoreState($oldState); $cursor->advanceBy($newPos - $cursor->getPosition()); return $cursor->getPreviousText(); } } __halt_compiler();----SIGNATURE:----BKD5ahFoWN5RvoWexPdfVxwuYJQn+5Fd5Xx7h97v0boQTMjsnjLpeeRTEV4w8XLSbqHri1pzPZG24LPrYBrf6ua0qqa2rqoteJZfebHGAoHyUOzVylA1F8P2gydA6Bxtp0AAspc6IkhcfcgN+xbxtFo8a1EIymS+Zia/oaT+bDCo0Plc6/ohHWPueu6LCqZvKsVsxOrUQAhSNOkchNsF1V3hbHNro+W76a1fhbQtx+ujsO3Rs23rKFMWE2SHhIe2/TL0p28pnVm275hK0urHLUYqNRqdnThlzcXHsAYM+TpcgHz3FglYtIDhD9LJ3S0ogbpNuJoghzPrt6fNBf0FvgX8w4MbmFZHSXQMXCftvuWrSpur+2o1NnGH2C5d2Iqeqm2XRwo3V1r4Dpk+tWQJgCTvOETCTxdMSO0FLKgfDpcYOV/w9AQlhleyqM3TjYGVRoKDm+PyQMt+E/ek8lXRw0YUf18mJ9qYVE6zGbc60MgoMYfT5CLa8BUBVa4aD+KQ3pg5AOoVaG/c62utj5KR6Id6IbEooF0ZbLhG/fyi3PcT3yuHyk4/sbWnryVvYMSCpUK1eLvXDEnSTDJ38EKag7F7tPvzLX0nzQRz2pZHeMdnApOUuWf1XCnLosv+eebOGg8q9T5fWwsWr20LVA2xtJ8KunaCjMvbHQv5CvLiADM=----ATTACHMENT:----Nzg2ODU3NzUxNjU4MzE3MyA5ODU4NTg1Mjg5Mzk0OTc3IDgyNzYyMTI1ODAzODUwMTg=