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:----k5hACFlYwhxfS3K+/9oEDUZYFu/81p8lJImgGe02qFyrSPEWs5fBb1TSHsgnmlGV3D4NC5g+YtWj5Nxcc09Qw9Cf8NYysZ3uNxdk+3U2JPD2fBqOxtfnlA1tWNNC+aQhLveBbw+UQTQtPDVoEoak+/ud7zjOEvxlnbllQ2Qelt3z0Dissx+MkL0a7JzJblcQiRIF5FqgvEGAaORderTYY41SHhJmiUNTjvRkMXLoxCI7QdXEEdj/xFFdAb3TRwlWecSlEBagKbGRzS9en5Eau9zgMybW43Ab9DHB1TspIx7ePyHe+mezXXalRtdtKkyon1HOoPsyftfcqFf2TeHSTheQ3NO/aOErfaYY3gIeqjkRt+qddF+fRB9eqLC9WSJecq9XQnbpO6TFbldAanE09RzlyvhKToakNvWeoVTWhQMXTC8+HqNMdKhES5YJXGAA3jA+C4TZ++GasOd8bbQYax6mI7VNnj7k1GR+9HdLq4BdmvIwEa8RxQl5VpHqJ4OQhQ9y21BE1Kdz1777PYiLv9lYMlDOwB7CmXBArNnPdyj0HzqVdqjt50EycHZHzOLMbxYF1JXAsED5lSYXRHq9dAEu2XZq8DuQHyrg4cApQsJI6AMBcDt1qm4xoSIVSHMfyZRzr3bgtXrwnN4RUAFYl17sK1jgLMKkj2Wbe8lsTjk=----ATTACHMENT:----NTQyOTM3MDk3NzEzNDc0NyA5MzkyMTk3MDQ4MzAxNDEwIDI0NjE4MjkzMzUyMjc1Ng==