This simple package allows you to define tokens that can be replaced in strings. Instead of a simple str_replace, Token Replace lets you add options to each token. Let's start with an example.
$input="Today is { date:m }}/{{ date:d }}/{{ date:y }}.";
echo \HollyIT\TokenReplace\TokenReplacer::from($input)
->with('date', \HollyIT\TokenReplace\Transformers\DateTransformer::class)
// Results in: Today is 11/11/21.
There is a certain anatomy to tokens, so let's take a look
at the {{ date:m }}. This is a default token format, but
this format is configurable globally and per instance.
| Part | Name | Global Setting | Local Setting |
|---|---|---|---|
| {{ | Token Start | $defaultStartToken | $instance->startToken() |
| date | Token Name | --- | --- |
| : | Token Separator | $defaultTokenSeparator | $instance->tokenSeparator() |
| m | Options | --- | --- |
| }} | Token End | $defaultEndToken | $instance->endToken() |
The replacement of tokens is handled via a transformer. A transformer can be a closure or a simple class.
Transformers can be added to each instance of the TokenReplacer or added globally by executing the following in the bootstrap phase of your app:
\HollyIT\TokenReplace\TokenReplacer::$defaultTransformers = [
'date' => \HollyIT\TokenReplace\Transformers\DateTransformer::class
];
Per instance tokens are added via $instance->with({token name}, {class name, transformer instance or closure}); For closure based transformers the signature is:
function(string $options, TokenReplacer $replacer)
All these transformers live under the \HollyIT\TokenReplace\Transformers namespace.
| Transformer | Description | Instantiating |
|---|---|---|
| ArrayTransformer | Extracts a value from an array based on a key. | The array |
| DateTransfomer | Extract parts of a date by PHP date format tokens. | Date object, Carbon, date string or null (assumes now()) |
| FileTransformer | Extract parts from a file based on pathinfo(). | The path string |
| ObjectTransformer | Extract a property from an object. | The object |
| UrlTransformer | Extract based on parse_url() | The URL string |
There are also special Laravel transformers residing in \HollyIT\TokenReplace\Transformers\Laravel
| Transformer | Description | Instantiating |
|---|---|---|
| AuthTransformer | Extract a property from the auth (user) object | none |
| DotArrayTransformer | Extract a property using Laravel's dot syntax | the array |
| ModelTransformer | Extract a property from an Eloquent model. For date properties, you can add the date part by specifying the format after the property name (ie: model:created_at,m) | The model |
| UploadFileTransformer | Extract the basename or extension from an UploadedFile object | The upload |
None of the transformers do any further processing except extracting the item. If you want to do further processing, such as escaping the replacements, you can define an onReplace callback:
$replacer->onReplace(function(string $result, string $token, string $options){
return strtoupper($result);
});
This callback will run for every token occurrence found, so you can further filter down what tokens to operate on by checking the $token property.
By default invalid and missing tokens will remain in the string. To prevent this, you can set removeEmpty() on the TokenReplacer.
This project was born out of a repeated scenario I faced on numerous projects. There are no real future plans for it. The entire objective here is a very simple solution to a common problem. You may find a transformer or feature that should be included. If so, please submit a PR. I'm very open on extending the project to cover more use cases.