$text = "apple pie and apple tart"; $pattern = '/apple(?= pie)/'; preg_match_all($pattern, $text, $matches); print_r($matches[0]);
PHP
$text = "apple pie and apple tart";
$pattern = '/apple(?= pie)/';
preg_match_all($pattern, $text, $matches);
print_r($matches[0]);
AArray ( [0] => apple [1] => apple )
BArray ( [0] => pie )
CArray ( [0] => apple )
DArray ( )
Attempts:
2 left
💡 Hint
Lookahead checks what comes after the word without including it.
✗ Incorrect
The pattern 'apple(?= pie)' matches 'apple' only if it is followed by ' pie'. In the text, only the first 'apple' is followed by ' pie', so only one match is found.
❓ Predict Output
intermediate
2:00remaining
Output of negative lookbehind regex in PHP
What will this PHP code output?
$text = "cat bat rat mat"; $pattern = '/(?preg_match_all($pattern, $text, $matches); print_r($matches[0]);
PHP
$text = "cat bat rat mat";
$pattern = '/(?<!b)at/';
preg_match_all($pattern, $text, $matches);
print_r($matches[0]);
AArray ( [0] => at [1] => at [2] => at )
BArray ( [0] => bat )
CArray ( [0] => at [1] => at )
DArray ( )
Attempts:
2 left
💡 Hint
Negative lookbehind excludes matches preceded by 'b'.
ALookbehind pattern has variable length which is not supported
BMissing delimiter in regex pattern
CUnescaped backslash in pattern
Dpreg_match requires third argument to be passed by reference
Attempts:
2 left
💡 Hint
Lookbehind in PHP requires fixed length patterns.
✗ Incorrect
PHP's PCRE engine requires lookbehind patterns to be of fixed length. '(?<=\d+)' is variable length (\d+ can match 1+ digits), which is not supported.
📝 Syntax
advanced
2:00remaining
Which regex pattern uses both lookahead and lookbehind correctly?
Which of the following PHP regex patterns correctly matches 'foo' only if it is preceded by 'bar' and followed by 'baz'?
A/(?<!bar)foo(?!baz)/
B/(?<=bar)foo(?<=baz)/
C/(?=bar)foo(?=baz)/
D/(?<=bar)foo(?=baz)/
Attempts:
2 left
💡 Hint
Lookbehind checks before, lookahead checks after the match.
✗ Incorrect
Option D uses positive lookbehind '(?<=bar)' to check before 'foo' and positive lookahead '(?=baz)' to check after 'foo'. This correctly matches 'foo' only when preceded by 'bar' and followed by 'baz'.
🚀 Application
expert
3:00remaining
Count words not starting with a digit using lookahead
You want to count how many words in the string "$text = '1apple apple 2banana banana 3cherry cherry'" do not start with a digit. Which PHP code snippet correctly counts these words using lookahead?
PHP
$text = '1apple apple 2banana banana 3cherry cherry';
// Your code here
Use negative lookahead to exclude words starting with digits and word boundaries to match whole words.
✗ Incorrect
Option B uses negative lookahead '(?!\d)' after '\b' to ensure the word does not start with a digit, and '\b\w+\b' to match whole words. This correctly counts 3 such words.
Practice
(1/5)
1. What does a positive lookahead (?=pattern) do in PHP regular expressions?
easy
A. Matches the pattern and consumes it in the string
B. Checks if the specified pattern precedes the current position and includes it in the match
C. Checks if the specified pattern follows the current position without including it in the match
D. Checks if the pattern is anywhere in the string regardless of position
Solution
Step 1: Understand lookahead behavior
A positive lookahead (?=pattern) checks if the pattern appears immediately after the current position without consuming characters.
Step 2: Compare options with definition
Checks if the specified pattern follows the current position without including it in the match correctly describes this behavior. Options B and C incorrectly describe lookbehind or normal matching. Checks if the pattern is anywhere in the string regardless of position is too broad.
Final Answer:
Checks if the specified pattern follows the current position without including it in the match -> Option C
Quick Check:
Positive lookahead = check after position [OK]
Hint: Lookahead checks after current spot without consuming [OK]
Common Mistakes:
Confusing lookahead with lookbehind
Thinking lookahead consumes characters
Assuming it matches anywhere, not just after position
2. Which of the following is the correct syntax for a negative lookbehind in PHP regex?
easy
A. (?pattern)
B. (?<=pattern)
C. (?!pattern)
D. (?=pattern)
Solution
Step 1: Recall lookbehind syntax
Negative lookbehind in PHP regex is written as (?<!pattern), which asserts that the pattern does NOT appear before the current position.
Step 2: Match options to syntax
(?
Final Answer:
(?<!pattern) -> Option A
Quick Check:
Negative lookbehind = (?<!pattern) [OK]
Hint: Lookbehind uses (?<=) or (?), negative has exclamation [OK]
Common Mistakes:
Mixing lookahead and lookbehind syntax
Using wrong brackets or missing exclamation mark
Confusing negative and positive forms
3. What will be the output of this PHP code?
$text = "apple pie";
if (preg_match('/apple(?= pie)/', $text)) {
echo "Match found";
} else {
echo "No match";
}
medium
A. Empty output
B. Match found
C. Syntax error
D. No match
Solution
Step 1: Understand the regex pattern
The pattern /apple(?= pie)/ matches 'apple' only if it is immediately followed by ' pie' without including ' pie' in the match.
Step 2: Check the input string
The string is "apple pie", so 'apple' is followed by ' pie'. The lookahead condition is true, so the match succeeds.
Final Answer:
Match found -> Option B
Quick Check:
Lookahead confirms 'apple' before ' pie' = Match found [OK]
Hint: Lookahead checks next chars without consuming [OK]
Common Mistakes:
Thinking lookahead consumes characters
Assuming no match because ' pie' is not part of match
Confusing output with syntax error
4. Identify the error in this PHP regex using lookbehind:
$text = "hello world";
if (preg_match('/(?
medium
A. No error, code runs fine
B. Lookbehind syntax is incorrect, missing brackets
C. Lookbehind must be at the end of the pattern
D. Lookbehind pattern is fixed width but 'hello' is variable length
Solution
Step 1: Check lookbehind syntax and pattern
The lookbehind (?<!hello) is valid because 'hello' is fixed length (5 characters), which PHP supports.
Step 2: Analyze the string and pattern match
The string is "hello world". The lookbehind asserts 'world' is NOT preceded by 'hello'. Here, 'world' is preceded by 'hello', so the match fails and "No match" is printed.
Final Answer:
No error, code runs fine -> Option A
Quick Check:
Lookbehind syntax correct, no error [OK]
Hint: Lookbehind must be fixed width, 'hello' is fixed length [OK]
Common Mistakes:
Thinking 'hello' is variable length
Assuming lookbehind syntax is wrong
Expecting match when lookbehind condition fails
5. You want to match all occurrences of the word 'cat' only if it is NOT preceded by 'wild' and is immediately followed by 's' in a string. Which regex pattern correctly uses lookahead and lookbehind in PHP?
hard
A. /(?<=wild )cat(?=s)/
B. /(?<=wild)cat(?=s)/
C. /(?wild)cat(?= s)/
D. /(?wild )cat(?=s)/
Solution
Step 1: Understand the requirements
We want 'cat' that is NOT preceded by 'wild ' (note the space) and IS followed immediately by 's'.
Step 2: Analyze each option
/(?(?<!wild ) to exclude 'wild ' before 'cat' and positive lookahead (?=s) to ensure 'cat' is followed by 's'. This matches the requirement. /(?<=wild )cat(?=s)/ uses positive lookbehind, which requires 'wild ' before 'cat', opposite of requirement. /(?/(?<=wild)cat(?=s)/ uses positive lookbehind without space, which is incorrect.