#php #regex #preg-replace
#php #регулярное выражение #preg-заменить
Вопрос:
Я пытаюсь удалить часть строки (которая оказывается URL-адресом) с помощью регулярного выражения. Я улучшаю регулярное выражение, но не могу понять, как сообщить ему, что содержимое до или после строки является необязательным. Вот что у меня есть
$string='http://www.example.com/username?refid=22';
$new_string= preg_replace('/[/?refid=0-9] /', '', $string);
echo $new_string;
Я пытаюсь удалить ?refid=22
часть, чтобы получить http://www.example.com/username
Идеи?
РЕДАКТИРОВАТЬ Я думаю, что мне нужно использовать регулярное выражение вместо explode, потому что иногда URL выглядит как http://example.com/profile.php?id=9999amp;refid=22
В этом случае я также хочу удалить refid
, но не получить id=9999
Ответ №1:
parse_url()
подходит для синтаксического анализа URL 🙂
$string = 'http://www.example.com/username?refid=22';
$url = parse_url($string);
// Ditch the query.
unset($url['query']);
echo array_shift($url) . '://' . implode($url);
Вывод
http://www.example.com/username
Если вы хотели удалить только этот конкретный параметр GET, сделайте это…
parse_str($url['query'], $get);
unset($get['refid']);
$url['query'] = http_build_query($get);
Вывод
http://example.com/profile.php?id=9999
Если у вас есть расширение, вы можете перестроить URL с помощью http_build_url()
.
В противном случае вы можете сделать предположения относительно имени пользователя / пароля / порта и создать его самостоятельно.
Обновить
Просто для развлечения, вот исправление для вашего регулярного выражения.
preg_replace('/?refid=d z/', '', $string);
[]
является символьным классом. Вы пытались поместить туда определенный порядок символов./
.d
это сокращенная версия символьного класса[0-9]
.- Я поместил туда якорь последнего символа (
z
), потому что, похоже, он всегда будет в конце вашей строки. Если нет, удалите его.
Комментарии:
1. @BandonRandon Мой приведенный выше код охватывает случай, когда вы хотите удалить только один параметр GET.
2. @alex, является ли этот метод более быстрым / стандартным по сравнению с регулярным выражением?
3. Регулярные выражения @Bandon обычно выполняются медленно. В любом случае, этот метод должен быть проще для чтения, и это то, что важно.
4.@Alex, извините за беспокойство, но, похоже, URL кодируется с помощью,
;
который является шестнадцатеричным для;
CodePad5. @Bandon Какую строку вы используете для ввода?
Ответ №2:
Не используйте регулярные выражения, если в этом нет необходимости
echo current( explode( '?', $string ) );