Удалить часть строки с помощью регулярного выражения

#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);
  

CodePad.

Вывод

 http://www.example.com/username
  

Если вы хотели удалить только этот конкретный параметр GET, сделайте это…

 parse_str($url['query'], $get);

unset($get['refid']);

$url['query'] = http_build_query($get);
  

CodePad.

Вывод

 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 кодируется с помощью, ; который является шестнадцатеричным для ; CodePad

5. @Bandon Какую строку вы используете для ввода?

Ответ №2:

Не используйте регулярные выражения, если в этом нет необходимости

 echo current( explode( '?', $string ) );