Installation
composer require sweetrdf/iri
First Use Case: Validating & Normalizing IRIs
use SweetRdf\Iri;
// Create an IRI instance
$iri = new Iri('http://example.com/path?query=value#fragment');
// Check if it's valid
if ($iri->isValid()) {
echo "Valid IRI!";
}
// Normalize the IRI (expands %20, resolves relative paths, etc.)
$normalized = $iri->getNormalized();
Key Classes & Methods to Explore
SweetRdf\Iri: Core class for IRI manipulation.SweetRdf\Iri\IriException: Exception handling.SweetRdf\Iri\IriParser: Underlying parser logic (useful for custom extensions).use SweetRdf\Iri;
class KnowledgeGraphModel extends Model
{
protected $iri;
public function setIriAttribute($value)
{
$this->iri = (new Iri($value))->getNormalized();
}
public function getIriAttribute($value)
{
return $value;
}
}
use SweetRdf\Iri;
use Illuminate\Http\Request;
public function store(Request $request)
{
$iri = $request->input('iri');
$normalizedIri = (new Iri($iri))->getNormalized();
if (!$normalizedIri->isValid()) {
throw new \InvalidArgumentException("Invalid IRI format.");
}
// Proceed with normalized IRI
}
$baseIri = new Iri('http://example.com/base/');
$relativeIri = new Iri('subpath#fragment', $baseIri);
echo $relativeIri->getNormalized(); // Outputs: http://example.com/base/subpath#fragment
zazuko/graphql-php or rubix/ml).$query = "SELECT ?s WHERE { ?s <http://example.com/predicate> ?o }";
$normalizedQuery = str_replace(
'http://example.com/predicate',
(new Iri('http://example.com/predicate'))->getNormalized(),
$query
);
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->singleton(Iri::class, function () {
return new Iri();
});
}
use Illuminate\Validation\Rule;
use SweetRdf\Iri;
Rule::macro('valid_iri', function ($attribute, $value, $parameters) {
return (new Iri($value))->isValid();
});
// Usage in FormRequest
$this->rules = [
'iri' => ['required', 'valid_iri'],
];
Repository class).use Illuminate\Support\Facades\Cache;
public function getNormalizedIri($iriString, $ttl = 3600)
{
return Cache::remember("iri_{$iriString}", $ttl, function () use ($iriString) {
return (new Iri($iriString))->getNormalized();
});
}
%20 → ), but some systems expect raw encoding.getCanonical() instead of getNormalized() if you need strict percent-encoding.$iri = new Iri('http://example.com/path%20with%20spaces');
echo $iri->getCanonical(); // Preserves %20
#fragment) are not normalized by default (e.g., #foo vs #FOO are treated as different).getNormalizedFragment() if case-insensitive fragments are needed.$iri = new Iri('http://example.com#Foo');
echo $iri->getNormalizedFragment(); // Outputs: foo
subpath) must be resolved against a base IRI or they’ll throw an exception.$base = new Iri('http://example.com/base/');
$relative = new Iri('subpath', $base); // Works
$invalid = new Iri('subpath'); // Throws IriException
例.测试) to Punycode.idn_to_ascii().$iri = new Iri('http://' . idn_to_ascii('例.测试') . '/path');
?key=value) and fragments (#fragment) are parsed but not validated for correctness.getQuery() and getFragment() to inspect/modify them separately.$iri = new Iri('http://example.com?invalid=query#fragment');
$iri->setQuery('valid=query'); // Override query
setStrictMode(true) to catch invalid IRIs early.$iri = new Iri('not an iri');
$iri->setStrictMode(true);
$iri->getNormalized(); // Throws IriException
$iri = new Iri('http://user:pass@example.com:8080/path?query=value#fragment');
dump([
'scheme' => $iri->getScheme(),
'userinfo' => $iri->getUserInfo(),
'host' => $iri->getHost(),
'port' => $iri->getPort(),
'path' => $iri->getPath(),
'query' => $iri->getQuery(),
'fragment' => $iri->getFragment(),
]);
try {
$iri = new Iri($userInput);
$normalized = $iri->getNormalized();
} catch (IriException $e) {
\Log::error("Invalid IRI submitted: {$userInput}", ['exception' => $e]);
throw new \RuntimeException('Invalid IRI format.');
}
use SweetRdf\Iri\IriParser;
class CustomIriParser extends IriParser
{
protected function validateHost($host)
{
if (!preg_match('/\.allowed-tld$/', $host)) {
throw new IriException("Host must end with .allowed-tld");
}
return parent::validateHost($host);
}
}
// Usage
$iri = new Iri('http://example.allowed-tld', null, new CustomIriParser());
mailto:, data:).$iri = new Iri('mailto:user@example.com');
echo $iri->getScheme(); // Outputs: mailto
How can I help you explore Laravel packages today?