summaryrefslogtreecommitdiff
path: root/docs/designers/language-basic-syntax/language-syntax-operators.md
blob: 965327c346ebee6b1ff1ac4f7829533d5f419f5c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
# Operators

## Basic

Various basic operators can be applied directly to variable values.

## Examples
```smarty
{$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

```smarty
{if "hello" matches "/^[a-z]+$/"}
    String matches the pattern!
{/if}

{if $email matches "/^[^@]+@[^@]+\.[^@]+$/"}
    Valid email format
{else}
    Invalid email format
{/if}
```

### Using Variables

```smarty
{$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:

```smarty
{* 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:

```smarty
{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:**
```smarty
{if $email matches "/^[^@\s]+@[^@\s]+\.[^@\s]+$/"}
    Valid email address
{else}
    Please enter a valid email address
{/if}
```

**Password Strength:**
```smarty
{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:**
```smarty
{if $url matches "/^https?:\/\/(www\.)?[a-z0-9\-]+(\.[a-z]{2,})+/i"}
    Valid URL format
{else}
    Please enter a valid URL
{/if}
```

**Numeric Validation:**
```smarty
{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:
```smarty
{$test ? "OK" : "FAIL"}
```
will result in OK if `$test` is set to true, and in FAIL otherwise.

There is also a shorthand `?:` operator:
```smarty
{$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':
```smarty
{$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.
```smarty
{$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 (''):
```smarty
{$myVar=""}
{$myVar ?: "this is not shown"}
```