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:----UHI/e4wVjkrtFzqc2JAZl1SPDZBMrSZq/PETJuD5F7zx93LWfEu0Izt06QMp8OL8qbxE7GtmhRUtN0Azsri5TL+QYXQ7Mk+jzlJCAbAe0xdj8jFvcb49Rq+dxJ9xDZQjmfLDqGxQLyrL8SQ9nt9I+m6FDH6Z3WQ9hOfULD8yn6IEd7cy8BrMUVTGTBy9hVlPhjqVjM8HlhHcz6QDEczX8gpa6NP6glFoZAwdDdA2CIybBdJrEJsDk33v3TWGxyVkFSuSPYMrfD1dY8dhfu/jN9ohZQ+X27UYteXvwNHOdcm0Z+c9r0lrPYQxPoYS1jhS8biP0pTAN3L/ZiKnjqEnhE0xOHdWLKNr9Q0UEn4I38J+pk/WzhukPd+sjWTfnnFLbG1lFW5u4/Sh6yLJzooI4z5jt8tjBdJwVJF21jBGgej3YRQ7m7ldjaYRNgCsUn/fgF02N91jSoVGa2hCadQ34SAdDHNI/2+diaBKaCuy0cTBSQpzdbtGYcKqGGO1DcSNpZ6OgWfI9s/wYapMj1l54pPLnqgQNd7t6vdbpIQFig8eo9w2DzI/PytlCcBYHJ53sjGz61+cuYIKifql5oYrr5ynKE6IORSd8xsUAljqz2tsm4E0PpJ0OILy+JFvKE40di32ZWjWeqCgePNkRWaHx2hDHVIFOBSG1VzYRsNSraw=----ATTACHMENT:----NDM0NDEwOTE5Njk1MDIxNiA3MTUwNDE1NTg1MjU2NTgzIDUwMDMxMTM4MzM3MDk2MzE=