Preg_replace for substitution in PHP - Time & Space Complexity
When using preg_replace in PHP, it's important to know how the time it takes grows as the input gets bigger.
We want to understand how the number of replacements affects the work done.
Analyze the time complexity of the following code snippet.
$string = "apple banana apple grape apple";
$pattern = '/apple/';
$replacement = 'orange';
$result = preg_replace($pattern, $replacement, $string);
This code replaces every occurrence of "apple" with "orange" in the given string.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The function scans the entire string to find matches for the pattern.
- How many times: It checks each character in the string, and for each match, it performs a replacement.
The time taken grows roughly in proportion to the length of the string because every character is checked.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks |
| 100 | About 100 checks |
| 1000 | About 1000 checks |
Pattern observation: Doubling the string length roughly doubles the work done.
Time Complexity: O(n)
This means the time to complete grows linearly with the size of the input string.
[X] Wrong: "preg_replace runs in constant time no matter the string size."
[OK] Correct: The function must check each character to find matches, so bigger strings take more time.
Understanding how pattern matching scales helps you explain performance when working with text processing in real projects.
"What if the pattern was more complex and used backreferences? How would that affect the time complexity?"
Practice
preg_replace do?Solution
Step 1: Understand the purpose of preg_replace
The function preg_replace searches a string for parts that match a pattern and replaces those parts with new text.Step 2: Compare with other functions
Counting matches or splitting strings are done by other functions like preg_match_all or preg_split, not preg_replace.Final Answer:
It finds text matching a pattern and replaces it with new text. -> Option CQuick Check:
preg_replace replaces matched text [OK]
- Confusing preg_replace with preg_match
- Thinking preg_replace counts matches
- Mixing preg_replace with string splitting functions
Solution
Step 1: Identify the pattern for digits
The pattern '\d' matches any single digit (0-9). In PHP single-quoted strings, it is written as '/\d/'.Step 2: Check other options
B uses '/d/', which matches the literal letter 'd'. C uses '/[0-9]+/', which matches one or more consecutive digits, replacing the entire group with a single '#'. D uses '/\D/', which matches non-digits.Final Answer:
preg_replace('/\d/', '#', $text); -> Option DQuick Check:
Use '\d' to match digits [OK]
- Forgetting to escape backslash in PHP strings
- Using 'd' instead of '\d' for digits
- Confusing '\d' with '\D' (non-digits)
$text = "Hello 123 World";
$result = preg_replace('/\d+/', 'NUM', $text);
echo $result;Solution
Step 1: Understand the regex pattern '/\d+/'
The pattern '\d+' matches one or more digits in a row. In the string, '123' matches this pattern.Step 2: Apply preg_replace to the string
The matched digits '123' are replaced by 'NUM'. So the string becomes 'Hello NUM World'.Final Answer:
Hello NUM World -> Option AQuick Check:
Digits replaced by 'NUM' = Hello NUM World [OK]
- Thinking only single digits replaced separately
- Expecting original digits to remain
- Confusing pattern with non-digit matching
$text = "abc123def";
$result = preg_replace('/[a-z]/', 1, $text, 2);
echo $result;Solution
Step 1: Check preg_replace argument order
The arguments are: pattern, replacement, subject, limit. The limit is correctly the fourth argument.Step 2: Check replacement type
The replacement should be a string. Using integer 1 will be converted to string '1' but is not recommended and can cause confusion.Step 3: Check other options
Pattern can be in single quotes. preg_replace supports limit parameter.Final Answer:
The replacement value must be a string, not an integer. -> Option BQuick Check:
Replacement should be string [OK]
- Passing integer instead of string as replacement
- Misplacing the limit parameter
- Thinking preg_replace can't limit replacements
'apple banana apple apple grape'. Which preg_replace call achieves this?Solution
Step 1: Understand the limit parameter in preg_replace
The fourth argument limits how many replacements happen. To replace only first two 'apple', limit should be 2.Step 2: Check each option's limit
preg_replace('/apple/', 'orange', 'apple banana apple apple grape', 2); uses limit 2, so only first two 'apple' replaced. preg_replace('/apple/', 'orange', 'apple banana apple apple grape'); replaces all. preg_replace('/apple/', 'orange', 'apple banana apple apple grape', 3); replaces first three. preg_replace('/apple/', 'orange', 'apple banana apple apple grape', 1); replaces only first one.Final Answer:
preg_replace('/apple/', 'orange', 'apple banana apple apple grape', 2); -> Option AQuick Check:
Limit 2 replaces first two matches [OK]
- Omitting limit to replace all occurrences
- Setting wrong limit number
- Confusing order of arguments
Ready to prove it?
Pass the test and this pattern moves unknown
