Я до сих пор не понимаю, как работает регулярное выражение с preg_replace. У меня есть URL-адрес в тексте:
site.com/user/login.php?valid=tru
site.com/eng/page/some_page.php?valid=tru&anothervar=1
Я хочу изменить его, чтобы он стал
site.com/user/login/
site.com/eng/page/some_page/
preg_replace(" 'no_mater_what_1'.php'no_mater_what_2' " , 'no_mater_what_1'/ , $some_var);
Но почему бы просто не сделать это:
$replace = explode('.php',$some_var);
$replace = $replace[0] . '/';
Потому что я считаю необходимым использовать регулярное выражение, потому что ".php" не повторяется в строке.
Чтобы избежать ловушек, как и другая подстрока .php
на пути, вы можете использовать эту замену:
$url = preg_replace('~\.php(?:[?#]\N*|\z)~i', '', $url, -1, $c);
if (!$c) // not a php file, do something else
или таким образом:
if (preg_match('~[^?#]+\.php(?=[?#]|\z)~Ai', $url, $m))
$url = $m[0];
else
// not a php file, do something else
Таким образом, соответствие .php
является расширением файла, потому что механизм регулярных выражений найдет самый левый результат, за которым следует либо ?
для части запроса, #
для части фрагмента или конца строки.
элементы шаблона:
\N
: символ, который не является символом новой строки.\z
: привязка для конца строки.A
: модификатор, который привязывает шаблон в начале строки(?=...)
: утверждение lookaheadПреимуществом такого подхода является безопасность с хорошей эффективностью.
Другой способ: parse_url
:
Вы можете использовать parse_url
для разделения URL- parse_url
на части. Если этот способ немного сообразителен, потому что вам нужно перестроить URL-адрес после (и то, как вы его перестроете, зависит от элементов, присутствующих в URL-адресе), однако это далеко не невозможно и обеспечивает слишком безопасный путь.
Поскольку ваши два примера отображаются в одной строке, это выглядит немного запутанным. Однако кажется, что вы хотите заменить все с.php на конец строки на /. Итак, используйте:
$new_link = preg_replace('/\.php.*$/', '/', $old_link);
Вам нужно\перед. потому как. это особый символ, который нужно убежать, чтобы заставить его работать как период. Затем вы ищете php в этом порядке, за которым следует что-нибудь до конца строки ($ означает конец строки). Вы заменяете все это на /.
Это должно работать
$subject = 'site.com/eng/page/some_page.php?valid=tru&anothervar=1';
if (preg_match('/(.*)\.php(?:\?.*)/', $subject, $regs)) {
$result = $regs[1] .'/';
echo $subject .' => '. $result;
} else {
echo 'NOT FOUND';
}
Регулярное выражение, делающее магию, это
/(.*)\.php(?:\?.*)?/
по частям:
(.*)\.php
Захватите все до (исключая) ".php"
(?:\?.*)
Поиск шаблона "?..."
?
Сделайте последний шаблон необязательным