Написать регулярное выражение в preg_replace

0

Я до сих пор не понимаю, как работает регулярное выражение с 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);
  • 1
    Это нужно для автоматического перенаправления или для чего?
Теги:
preg-replace

4 ответа

0
Лучший ответ

Но почему бы просто не сделать это:

$replace = explode('.php',$some_var);
$replace = $replace[0] . '/';

Потому что я считаю необходимым использовать регулярное выражение, потому что ".php" не повторяется в строке.

  • 1
    Предположим, URL-адрес, как site.com/user/auth.phpscripts/login.php?no_care
  • 0
    Ну, я не думаю, что дело будет присутствовать, это очень маловероятно
Показать ещё 2 комментария
1

Чтобы избежать ловушек, как и другая подстрока .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-адресе), однако это далеко не невозможно и обеспечивает слишком безопасный путь.

0

Поскольку ваши два примера отображаются в одной строке, это выглядит немного запутанным. Однако кажется, что вы хотите заменить все с.php на конец строки на /. Итак, используйте:

$new_link = preg_replace('/\.php.*$/', '/', $old_link);

Вам нужно\перед. потому как. это особый символ, который нужно убежать, чтобы заставить его работать как период. Затем вы ищете php в этом порядке, за которым следует что-нибудь до конца строки ($ означает конец строки). Вы заменяете все это на /.

0

Это должно работать

$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"

(?:\?.*)

Поиск шаблона "?..."

?

Сделайте последний шаблон необязательным

  • 0
    Спасибо за объяснение! Это будет полезно для меня в будущем!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню