Operators
Basic
Various basic operators can be applied directly to variable values.
Examples
{$foo + 1}
{$foo * $bar}
{$foo->bar - $bar[1] * $baz->foo->bar() -3 * 7}
{if ($foo + $bar.test % $baz * 134232 + 10 + $b + 10)}
...
{/if}
{$foo = $foo + $bar}
Note
Although Smarty can handle some very complex expressions and syntax, it is a good rule of thumb to keep the template syntax minimal and focused on presentation. If you find your template syntax getting too complex, it may be a good idea to move the bits that do not deal explicitly with presentation to PHP by way of plugins or modifiers.
List
The following is a list of recognized operators, which must be separated from surrounding elements by spaces. Note that items listed in [brackets] are optional. PHP equivalents are shown where applicable.
| Operator | Alternates | Syntax Example | Meaning | PHP Equivalent |
|---|---|---|---|---|
| == | eq | $a eq $b | equals | == |
| != | ne, neq | $a neq $b | not equals | != |
| > | gt | $a gt $b | greater than | > |
| < | lt | $a lt $b | less than | < |
| >= | gte, ge | $a ge $b | greater than or equal | >= |
| <= | lte, le | $a le $b | less than or equal | <= |
| === | $a === 0 | check for identity | === | |
| ! | not | not $a | negation (unary) | ! |
| % | mod | $a mod $b | modulo | % |
| is [not] div by | $a is not div by 4 | divisible by | $a % $b == 0 | |
| is [not] even | $a is not even | [not] an even number (unary) | $a % 2 == 0 | |
| is [not] even by | $a is not even by $b | grouping level [not] even | ($a / $b) % 2 == 0 | |
| is [not] odd | $a is not odd | [not] an odd number (unary) | $a % 2 != 0 | |
| is [not] odd by | $a is not odd by $b | [not] an odd grouping | ($a / $b) % 2 != 0 | |
| is in | $a is in $b | exists in array | in_array($a, $b) | |
| is [not] in | $a is not in $b | does not exist in array | !in_array($a, $b) | |
| matches | $a matches $b | regex pattern match | preg_match($b, $a) |
Regex Matching Operator
The matches operator allows you to test if a string matches a regular expression pattern.
Basic Usage
{if "hello" matches "/^[a-z]+$/"}
String matches the pattern!
{/if}
{if $email matches "/^[^@]+@[^@]+\.[^@]+$/"}
Valid email format
{else}
Invalid email format
{/if}
Using Variables
{$pattern = '/^[a-zA-Z0-9]{8,}$/'}
{if $password matches $pattern}
Password meets requirements
{else}
Password must be at least 8 alphanumeric characters
{/if}
Pattern Modifiers
The matches operator supports all standard PHP regex modifiers:
{* Case insensitive matching *}
{if "HELLO" matches "/hello/i"}
Matches (case insensitive)
{/if}
{* Multiline mode *}
{if "line1\nline2" matches "/line2$/m"}
Matches in multiline mode
{/if}
{* Dot matches newlines *}
{if "hello\nworld" matches "/hello.world/s"}
Matches with dotall modifier
{/if}
Complex Conditions
The matches operator can be combined with other operators:
{if $username matches "/^[a-z]+$/" && $username|length > 3}
Valid username
{else}
Username must be lowercase letters and at least 4 characters
{/if}
{if $input matches "/^[0-9]+$/" || $input matches "/^[a-z]+$/"}
Input is either numeric or lowercase letters
{else}
Invalid input format
{/if}
Practical Examples
Email Validation:
{if $email matches "/^[^@\s]+@[^@\s]+\.[^@\s]+$/"}
Valid email address
{else}
Please enter a valid email address
{/if}
Password Strength:
{if $password matches "/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/"}
Strong password
{else}
Password must contain uppercase, lowercase, numbers and be at least 8 characters
{/if}
URL Validation:
{if $url matches "/^https?:\/\/(www\.)?[a-z0-9\-]+(\.[a-z]{2,})+/i"}
Valid URL format
{else}
Please enter a valid URL
{/if}
Numeric Validation:
Notes
- The
matchesoperator uses PHP'spreg_match()function internally - Pattern delimiters must be valid regex delimiters (typically
/) - Invalid patterns will cause PHP warnings but won't break template execution
- For complex regex patterns, consider using variables for better readability
Ternary
You can use the ?: (or ternary) operator to test one expression and present the value
of the second or third expression, based on the result of the test.
In other words:
will result in OK if$test is set to true, and in FAIL otherwise.
There is also a shorthand ?: operator:
$myVar is not set or set to something that evaluates to false, such as an empty string.
If $myVar is set to something that evaluates to true, the value of $myVar is returned. So, the following will
return 'hello':
Testing for null
If "something that evaluates to false" is to broad a test for you, you can use the ?? (or null coalescing) operator
to trigger only if the tested value is undefined or set to null.
$myVar is not set or set to null.
If $myVar is set to something that evaluates to anything else, the value of $myVar is returned. So, the following will
return an empty string (''):