+
+ return (string) $scalar;
+ }
+
+ /**
+ * @param string $value
+ * @param int &$i
+ * @param int $flags
+ *
+ * @return null|string
+ */
+ private static function parseTag($value, &$i, $flags)
+ {
+ if ('!' !== $value[$i]) {
+ return;
+ }
+
+ $tagLength = strcspn($value, " \t\n", $i + 1);
+ $tag = substr($value, $i + 1, $tagLength);
+
+ $nextOffset = $i + $tagLength + 1;
+ $nextOffset += strspn($value, ' ', $nextOffset);
+
+ // Is followed by a scalar
+ if ((!isset($value[$nextOffset]) || !in_array($value[$nextOffset], array('[', '{'), true)) && 'tagged' !== $tag) {
+ // Manage non-whitelisted scalars in {@link self::evaluateScalar()}
+ return;
+ }
+
+ // Built-in tags
+ if ($tag && '!' === $tag[0]) {
+ throw new ParseException(sprintf('The built-in tag "!%s" is not implemented.', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
+ }
+
+ if (Yaml::PARSE_CUSTOM_TAGS & $flags) {
+ $i = $nextOffset;
+
+ return $tag;
+ }
+
+ throw new ParseException(sprintf('Tags support is not enabled. Enable the `Yaml::PARSE_CUSTOM_TAGS` flag to use "!%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);