Skip to content

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:

{if $input matches "/^[0-9]+$/"}
    Valid numeric input
{else}
    Please enter numbers only
{/if}

Notes

  • The matches operator uses PHP's preg_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:

{$test ? "OK" : "FAIL"}
will result in OK if $test is set to true, and in FAIL otherwise.

There is also a shorthand ?: operator:

{$myVar ?: "empty"}
will result in 'empty' if $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':
{$myVar="hello"}
{$myVar ?: "empty"}

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 ?? "empty"}
will result in 'empty' if $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 (''):
{$myVar=""}
{$myVar ?: "this is not shown"}