$segment) { $pathSegment = self::_tokenize($segment); if (0 == $key) { if (0 === strpos($pathSegment, '[contains(@class')) { $paths[0] .= '*' . $pathSegment; } else { $paths[0] .= $pathSegment; } continue; } if (0 === strpos($pathSegment, '[contains(@class')) { foreach ($paths as $key => $xpath) { $paths[$key] .= '//*' . $pathSegment; $paths[] = $xpath . $pathSegment; } } else { foreach ($paths as $key => $xpath) { $paths[$key] .= '//' . $pathSegment; } } } if (1 == count($paths)) { return $paths[0]; } return implode(' | ', $paths); } /** * Tokenize CSS expressions to XPath * * @param string $expression * @return string */ protected static function _tokenize($expression) { // Child selectors $expression = str_replace('>', '/', $expression); // IDs $expression = preg_replace('|#([a-z][a-z0-9_-]*)|i', '[@id=\'$1\']', $expression); $expression = preg_replace('|(?