private function isNCName($name, $offset = 0, $fullName = NULL)
{
$nameStartChar = 'A-Z_a-z' . '\\x{C0}-\\x{D6}\\x{D8}-\\x{F6}\\x{F8}-\\x{2FF}\\x{370}-\\x{37D}' . '\\x{37F}-\\x{1FFF}\\x{200C}-\\x{200D}\\x{2070}-\\x{218F}' . '\\x{2C00}-\\x{2FEF}\\x{3001}-\\x{D7FF}\\x{F900}-\\x{FDCF}' . '\\x{FDF0}-\\x{FFFD}\\x{10000}-\\x{EFFFF}';
$nameChar = $nameStartChar . '\\.\\d\\x{B7}\\x{300}-\\x{36F}\\x{203F}-\\x{2040}';
if ($offset > 0) {
$namePart = substr($name, $offset);
} else {
$namePart = $name;
$name = $fullName ?: $namePart;
}
if (empty($namePart)) {
throw new \UnexpectedValueException('Invalid QName "' . $name . '": Missing QName part.');
} elseif (preg_match('([^' . $nameChar . '-])u', $namePart, $match, PREG_OFFSET_CAPTURE)) {
//invalid bytes and whitespaces
$position = (int) $match[0][1];
throw new \UnexpectedValueException('Invalid QName "' . $name . '": Invalid character at index ' . ($offset + $position) . '.');
} elseif (preg_match('(^[^' . $nameStartChar . '])u', $namePart)) {
//first char is a little more limited
throw new \UnexpectedValueException('Invalid QName "' . $name . '": Invalid character at index ' . $offset . '.');
}
return TRUE;
}