Installation
composer require phpgt/cssxpath
No additional configuration is required—just autoload.
First Use Case Convert a simple CSS selector to XPath:
use Phpgt\CssXpath\CssXpath;
$cssXpath = new CssXpath();
$xpath = $cssXpath->cssToXpath('div.content > p');
echo $xpath; // Output: "//div[contains(@class, 'content')]/p"
Where to Look First
tests/ folder) for usage examples.CssXpath::cssToXpath()—the core method.Selector Conversion
$converter = new CssXpath();
$xpath = $converter->cssToXpath('article.post:first-child h2');
// Output: "//article[contains(@class, 'post')][1]/h2"
Integration with DOM Parsing
use Phpgt\CssXpath\CssXpath;
use DOMDocument;
$dom = new DOMDocument();
$dom->loadHTML('<div class="user"><span>John</span></div>');
$converter = new CssXpath();
$xpath = $converter->cssToXpath('div.user span');
$elements = $dom->evaluate($xpath);
Batch Processing
$selectors = ['.header', '#main', 'li.active'];
$converter = new CssXpath();
foreach ($selectors as $selector) {
$xpath = $converter->cssToXpath($selector);
// Use $xpath in queries
}
Dynamic Selector Handling
$userInput = request('selector');
$xpath = (new CssXpath())->cssToXpath($userInput);
// Sanitize $userInput first to avoid XSS!
Combining with Laravel Collections
$html = '<div class="items"><span>1</span><span>2</span></div>';
$dom = new DOMDocument();
$dom->loadHTML($html);
collect(['span', '.items span'])
->map(fn($sel) => (new CssXpath())->cssToXpath($sel))
->each(fn($xpath) => $dom->evaluate($xpath));
Attribute Selector Quirks
div[href] becomes XPath //div[@href] (works), but div[href^="http"] may not map perfectly to XPath’s starts-with().Pseudo-classes
:nth-child(2n) converts to [position()=2 or position()=4 or ...]—verbose but correct.Namespaces
html:div). Extend the class or prepend namespaces manually:
$xpath = '//ns:div[contains(@class, "content")]';
Performance
$xpath = $converter->cssToXpath('div > p:first-of-type');
$dom->evaluate($xpath); // Throws exception if invalid
$converter = new CssXpath();
$converter->setDebug(true); // Hypothetical; check if supported
Custom Rules
Override Phpgt\CssXpath\CssXpath and extend cssToXpath():
class CustomCssXpath extends CssXpath {
protected function handlePseudoClass($pseudo) {
// Custom logic for :custom-pseudo
}
}
Pre/Post-Processing
$rawXpath = $converter->cssToXpath('div');
$finalXpath = "//root/$rawXpath"; // Inject into larger query
Testing
DOMDocument to test XPath results:
$dom = $this->createMock(DOMDocument::class);
$dom->method('evaluate')->willReturn(new DOMNodeList());
How can I help you explore Laravel packages today?