Как вы перебираете строку в php и заменяете символы «%», за которыми следует ТОЛЬКО другой символ «%»? - PullRequest
1 голос
/ 28 февраля 2011

Вот что я пытаюсь достичь в PHP:

У меня есть эта строка: host / %%% 25asd %%

Теперь я хочу пройтись по нему и заменить только символы% _blank на% 25. Таким образом, я получаю вывод как host /% 25% 25% 25asd% 25% 25. (% 25 не был затронут, потому что за% не последовал другой%)

Как мне поступить так? регулярное выражение? если так, у вас есть пример? или перебрать все символы в строке и заменить? Я думал об использовании str_pos для этого, но, возможно, после одной замены позиции в строке изменятся: (

[Редактировать: Позвольте мне добавить пару дополнительных сведений, чтобы облегчить путаницу. % 25 это просто пример, это может быть что-то вроде% 30 или% 0a, я не буду знать заранее. Также строка может быть хостом / %% 25asd %%, поэтому просто замените %% на «хост /% 2525asd% 25 вместо хоста /% 25% 25asd% 25» То, чего я пытаюсь добиться - это проанализировать URL-адрес, чтобы узнать, как Google хочет его для своих веб-приложений. http://code.google.com/apis/safebrowsing/developers_guide_v2.html#Canonicalization. Если вы посмотрите на их странные примеры.]

Ответы [ 4 ]

3 голосов
/ 28 февраля 2011

Как насчет простой строки (без регулярных выражений) вместо '%%' на '% 25% 25'?

Предполагается, что вы действительно хотите, чтобы вывод был host /% 25% 25% 25asd% 25% 25, ​​как вы упомянули, а не one % 25 в конце.

edit : Это еще один метод, который может работать в вашем случае:

Используйте методы urlencode и urldecode , например ::

$string = urlencode(urldecode("host/%%%25asd%%"));
3 голосов
/ 28 февраля 2011

Использование preg_replace:

$string = preg_replace('/%(?=%)/', '%25', $string);

Обратите внимание на предварительное утверждение.Это соответствует каждому %, за которым следует %, и заменяет его на %25.

Результат:

host/%25%25%25asd%25%

РЕДАКТИРОВАТЬ Пропущенный случайдля последнего % см .:

$string = preg_replace('/%(?=(%|$))/', '%25', $string);

Таким образом, предварительное утверждение проверяет следующий символ на наличие другого % или конца строки.

0 голосов
/ 28 февраля 2011

Как насчет этого?

s/%(?![0-9a-f]+)/%25/ig;

$str = 'host/%%%25asd%%';
$str =~ s/ % (?![0-9a-f]+) /%25/xig;
print $str."\n";

host/%25%25%25asd%25%25

0 голосов
/ 28 февраля 2011

используйте str_replace введите описание ссылки здесь вместо preg_replace, его намного проще применять и чистить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...