2015-01-27 2 views
0

Я, как правило, теряю трек, когда имею дело с большим количеством специальных персонажей.preg_replace с большим количеством специальных символов

У меня есть некоторые URL-адреса (плохо отформатированные, недостаточно согласованные для использования parse_url), и я хочу заменить все вхождения параметров «мертвым» и «мертвым» = some_text_here без ничего.

Могут быть и другие переменные до и после.

Пример URLs:

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 

ответ

1

Я думаю, что вы хотите что-то вроде этого шаблона?

(\?dead(=[^&]*|))* 

PHP код:

echo preg_replace('/(\?dead(=[^&]*|))*/','',$sourcestring); 

Это произведет этот вывод ваших данных URLs:

http://www.url.com/&wow=test 
http://www.url.com/&wow=test 
http://www.url.com/?hello 
+0

это работает, великий человек :) –

0

Вы можете использовать \Q and \E (как в цитирую) при работе с большим количеством специальных символов ,

Текст между этими разделителями будет трактоваться буквально.

0

Как насчет:

$parsed_url = preg_replace("/\?dead(?:=[^&?]*)?/", "", $url); 

preg_replace должны соответствовать все возникновения по умолчанию (параметр $limit является -1 по умолчанию).

Это регулярное выражение очень похож на ваш, но вместо .* он использует [^&?]* чтобы соответствовать до следующего ? или &

Смежные вопросы