Я, как правило, теряю след, когда имею дело с большим количеством специальных персонажей.
У меня есть некоторые URL-адреса (плохо отформатированные, недостаточно последовательные для использования parse_url), и я хочу заменить все вхождения параметров "dead" и/или "dead" = some_text_here ни с чем.
Могут быть и другие переменные до и после.
Примеры URL:
http://www.url.com/?dead?dead=whatever_text&wow=test
http://www.url.com/?hello?dead=whatever_text
Это то, что я думал, будет работать, но это не так.
$parsed_url = preg_replace("/(\?dead(?:=.*?)?)(?:\&|$|\?)/", "", $url);
То, что он должен делать, это проверить "мертвый", с необязательным значением позади, а затем заменить это на ничего. Но это также заменяет? и &, если есть параметр, следующий за параметром? dead. Также его единственное замещение 1, не все.
Это делает
http://www.url.com/?dead?dead=whatever_text&wow=test
Стали
http://www.url.com/dead=whatever_text&wow=test
Я думаю, вы хотите что-то вроде этой картины?
(\?dead(=[^&]*|))*
Код PHP:
echo preg_replace('/(\?dead(=[^&]*|))*/','',$sourcestring);
Это приведет к выходу ваших данных:
http://www.url.com/&wow=test
http://www.url.com/&wow=test
http://www.url.com/?hello
Как насчет:
$parsed_url = preg_replace("/\?dead(?:=[^&?]*)?/", "", $url);
preg_replace
должен соответствовать всем событиям по умолчанию (по умолчанию параметр $limit
-1
).
Это регулярное выражение очень похоже на ваше, но вместо .*
Оно использует [^&?]*
Для соответствия до следующего ?
или &
Вы можете использовать \Q
и \E
(как в QuotE), когда имеете дело со множеством специальных символов.
Текст между этими разделителями будет трактоваться буквально.