$re = '/(?:having\s*?[^\s]+\s*?[^\w\s])/i';
$str = '=== libinjection tests ===
1 I like having true friends
I like having true friends
I having true friends
I was having true friends
1 having
Family and friends having meal outdoors
=== FP ===
1 I like having true, friends
1 having test, test
Family and friends having meal, outdoors
having test , test
having test test,
=== SQL ===
8\' GROUP BY ID_ARTICLE HAVING COUNT(ID_ARTICLE) = \'2\'
8\' GROUP BY ID_ARTICLE HAVING 1 = 1
8\' GROUP BY ID_ARTICLE HAVING 1,
8\' GROUP BY ID_ARTICLE HAVING true,
FROM Sales.SalesOrderDetail GROUP BY SalesOrderID HAVING SalesOrderID > 50000
-3223%\'))) OR 1 GROUP BY CONCAT(0x716a787a71,(SELECT (CASE WHEN (3900=3900) THEN 1 ELSE 0 END)),0x7171627671,FLOOR(RAND(0)*2)) HAVING MIN(0)#"
-2906%\' OR 1 GROUP BY CONCAT(0x716a787a71,(SELECT (CASE WHEN (3900=3900) THEN 1 ELSE 0 END)),0x7171627671,FLOOR(RAND(0)*2)) HAVING MIN(0)#"
-2836%00\' OR 1 GROUP BY CONCAT(0x716a787a71,(SELECT (CASE WHEN (3900=3900) THEN 1 ELSE 0 END)),0x7171627671,FLOOR(RAND(0)*2)) HAVING MIN(0)#"
-8115 OR 1 GROUP BY CONCAT(0x716a787a71,(SELECT (CASE WHEN (3900=3900) THEN 1 ELSE 0 END)),0x7171627671,FLOOR(RAND(0)*2)) HAVING MIN(0)#"
-2949 OR 1 GROUP BY CONCAT(0x716a787a71,(SELECT (CASE WHEN (3900=3900) THEN 1 ELSE 0 END)),0x7171627671,FLOOR(RAND(0)*2)) HAVING MIN(0)#"
-4609) WHERE 5091=5091 OR 1 GROUP BY CONCAT(0x716a787a71,(SELECT (CASE WHEN (3900=3900) THEN 1 ELSE 0 END)),0x7171627671,FLOOR(RAND(0)*2)) HAVING MIN(0)#"
1 having 1=1
1 having 1
1 having 1=1
1 having id=id
I am having trouble -.-
';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php