s9e/regexp-builder
Generate compact regular expressions that match a given list of strings (ideal for keyword search). Builds optimized patterns like ba[rz]|foo from input terms, with factories for PHP, Java, JavaScript, RE2, plus RawBytes/RawUTF8 output modes.
Installation:
composer require s9e/regexp-builder
No additional configuration is required—just autoload the package.
First Use Case: Generate a regex to match a predefined list of strings (e.g., usernames, keywords, or validation rules):
use S9e\Regexp\Builder;
$builder = new Builder();
$regex = $builder->addStrings(['apple', 'banana', 'cherry'])->getRegex();
// Output: `^(?:apple|banana|cherry)$`
Where to Look First:
String Matching: Dynamically build regexes for input validation or filtering:
$builder = new Builder();
$builder->addStrings(['admin', 'moderator', 'user'])
->anchorStart()
->anchorEnd();
$regex = $builder->getRegex(); // `^admin|moderator|user$`
Pattern Reuse: Combine static patterns with dynamic strings:
$builder = new Builder();
$builder->addPattern('^https?://') // Prefix
->addStrings(['example.com', 'google.com'])
->addPattern('/.*$'); // Suffix
Laravel Integration:
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($request->all(), [
'username' => ['required', function ($attribute, $value, $fail) {
$regex = (new Builder())->addStrings(['admin', 'root'])->getRegex();
if (preg_match($regex, $value)) {
$fail('Username restricted.');
}
}]
]);
Route::where('slug', $regex)).Caching Compiled Regexes: Store generated regexes in Laravel’s cache for performance:
$cacheKey = 'regex_user_roles';
$regex = Cache::remember($cacheKey, now()->addHours(1), function () {
return (new Builder())->addStrings(['editor', 'author'])->getRegex();
});
$builder->addString('a1')->addString('b2')->addCharacterClass('digit');
// Output: `[a-b][0-9]`
$builder->addString('abc')->addString('abcd')->addString('abcde')
->addQuantifier('+'); // Matches 1+ occurrences
$builder->addStrings(['Apple', 'Banana'])
->caseInsensitive()
->getRegex(); // `^(?:apple|banana)$` with `i` flag
Overly Complex Regexes:
^(?:str1|str2|...|str1000)$).addCharacterClass() for similar strings or split into multiple builders.Anchors and Partial Matches:
anchorStart()/anchorEnd() may allow unintended partial matches.Special Characters:
., *) may break the pattern.addString() (auto-escapes) or addPattern() for manual control.Performance:
preg_last_error() to debug malformed regexes:
$regex = $builder->getRegex();
if (!preg_match($regex, 'test')) {
echo 'Error: ' . preg_last_error();
}
getRegex() after each add* method to verify incremental builds:
$builder->addString('test');
echo $builder->getRegex(); // `test`
$builder->anchorStart();
echo $builder->getRegex(); // `^test`
Custom Escaping: Override escaping logic for non-standard strings:
$builder->setStringEscaper(function ($str) {
return preg_quote($str, '/');
});
Post-Processing: Modify the final regex with a callback:
$regex = $builder->getRegex();
$regex = preg_replace('/\|/', '|', $regex); // Example tweak
Laravel Service Provider: Bind the builder to the container for dependency injection:
$this->app->singleton(Builder::class, function () {
return new Builder();
});
Testing:
Use Laravel’s Assert to validate regex behavior:
$this->assertMatchesRegularExpression(
(new Builder())->addStrings(['foo', 'bar'])->getRegex(),
'foo'
);
How can I help you explore Laravel packages today?