Surely, you can achieve what you want with strpos
, but you specified you only need a regex solution. Note that this is not the best approach for this task unless you need to check for the substrings in a specific context (like within word boundaries, or after or before specific symbols, etc.)
The (?<!love).+fruit
regex matches any 1+ characters that are not preceded with love
substring up to the fruit
substring. It will match I love fruit
because the lookbehind asserts true at the beginning of the string, then .+
grabs the whole string, then backtracking does its job to get fruit
.
In fact, you only need 1 lookahead to check if there is no love
anchored at the start of the string:
^(?!.*love).*fruit
^^^^^^^^^^
See the regex demo
You only check for the substring love
with (?!.*love)
at the beginning of the string (due to ^
), and then, if it is missing, the regex goes on matching any characters (other than a newline if /s
modifier is not use) up to the last fruit
.
Here is a PHP demo:
$re = "/^(?!.*love).*fruit/";
if (preg_match($re, "We all love green fruit."))
{
echo "Matched!"; // Won't be displayed since there is no match
}