Как сказал Дмитрий, вам нужно больше убегать.
* * * * * * В регулярных выражениях {1}
не гарантирует, что шаблон встречается только один раз во всем объекте.Это квантификатор только для предыдущей строки.
В противном случае проверьте вручную, как часто оно соответствует:
preg_match_all("/(\.php\??)/", $str, $m);
$matched_once = count($m[1]) == 1;
Если вы хотите проверить всю строку, то вам нужно указать полный шаблон,Используйте ^
или $
.Например, в вашем случае:
preg_match("/\.php(\?[^?]*|)$/", $str)
Где оно либо соответствует .php?...
(со всем, кроме знаков вопроса после), либо просто .php
в самом конце ($
отмечает конец в регулярных выражениях).