Preg_match_all for global matching in PHP - Time & Space Complexity
We want to understand how the time it takes to find all matches in a string grows as the string gets longer.
How does the number of matches and string length affect the work done?
Analyze the time complexity of the following code snippet.
$pattern = '/\d+/';
$text = 'There are 123 apples and 4567 oranges.';
preg_match_all($pattern, $text, $matches);
// $matches will hold all groups of digits found in $text
This code finds all groups of digits in a text string and stores them.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Scanning each character in the input string to find matches.
- How many times: Once for each character in the string, plus extra work for each match found.
As the string gets longer, the function checks more characters to find matches.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks |
| 100 | About 100 checks |
| 1000 | About 1000 checks |
Pattern observation: The work grows roughly in direct proportion to the string length.
Time Complexity: O(n)
This means the time to find all matches grows linearly with the length of the input string.
[X] Wrong: "preg_match_all runs in constant time no matter the string size."
[OK] Correct: The function must check each character to find matches, so longer strings take more time.
Understanding how pattern matching scales helps you write efficient code when working with text data.
"What if the pattern was more complex, like including optional parts or repetitions? How would the time complexity change?"
Practice
preg_match_all do?Solution
Step 1: Understand the function purpose
preg_match_allis designed to find every occurrence of a pattern in a string, not just the first one.Step 2: Compare with other functions
preg_matchfinds only the first match,preg_replacereplaces matches, andpreg_splitsplits strings. So onlypreg_match_allfinds all matches and stores them.Final Answer:
Finds all matches of a pattern in a string and stores them in an array. -> Option DQuick Check:
preg_match_all = all matches found [OK]
- Confusing preg_match_all with preg_match
- Thinking it replaces matches
- Assuming it splits strings
preg_match_all in PHP?Solution
Step 1: Recall function parameter order
The correct order is pattern first, then the string to search (subject), then the array to store matches.Step 2: Verify options
Only preg_match_all($pattern, $subject, $matches); follows this order:preg_match_all($pattern, $subject, $matches);Final Answer:
preg_match_all($pattern, $subject, $matches); -> Option BQuick Check:
Pattern, subject, matches array order [OK]
- Swapping pattern and subject parameters
- Placing matches array before subject
- Using wrong parameter order
$text = "apple, banana, cherry";
preg_match_all('/\b\w{6}\b/', $text, $matches);
print_r($matches[0]);Solution
Step 1: Understand the regex pattern
The pattern/\b\w{6}\b/matches words with exactly 6 letters.Step 2: Check the words in the string
"apple" has 5 letters, "banana" has 6, "cherry" has 6. So only "banana" and "cherry" match.Final Answer:
["banana", "cherry"] -> Option CQuick Check:
Words with 6 letters = banana, cherry [OK]
- Including words with length not equal to 6
- Misunderstanding \b word boundaries
- Confusing \w with any character
preg_match_all:
$text = "one two three";
preg_match_all('/\w+/', $matches, $text);
print_r($matches);Solution
Step 1: Check parameter order in preg_match_all
The correct order is pattern, subject string, then matches array. Here, $matches and $text are swapped.Step 2: Identify the impact
Passing $matches as the subject and $text as matches causes wrong behavior and no matches found.Final Answer:
The order of parameters is incorrect. -> Option AQuick Check:
Parameter order matters in preg_match_all [OK]
- Swapping subject and matches parameters
- Assuming regex pattern is wrong
- Thinking print_r can't print arrays
preg_match_all. Which pattern correctly matches a simple email format (letters, digits, dots, underscores before @, then domain)?Solution
Step 1: Analyze the email pattern requirements
Emails have letters, digits, dots, underscores before @, then domain with dot and extension.Step 2: Check each pattern
'/[\w\.]+@[\w\.]+\.[a-z]{2,}/i' matches word characters and dots before @, then domain and extension with at least 2 letters, case insensitive. Others are too restrictive or incorrect.Final Answer:
'/[\w\.]+@[\w\.]+\.[a-z]{2,}/i' -> Option AQuick Check:
Pattern includes letters, digits, dots, underscores [OK]
- Using \d+ only before @ (digits only)
- Forcing exact 3-letter domain extensions
- Adding spaces inside email pattern
Ready to prove it?
Pass the test and this pattern moves unknown
