str_replace() не заменяет каждое вхождение

Я понял, что у меня есть какая-то странная проблема с str_replace(), где он, по-видимому, не заменяет каждое вхождение $search на $replace, даже если я не указал переменную $count... Мой код

    echo "head_title_array ".html_entity_decode($head_title_array['title'])."\n\n";
    $Mytitle = strtolower(str_replace(" ", "_", html_entity_decode($head_title_array['title'])));
    echo "Mytitle ".$Mytitle;

и вывод:

      head_title_array Stay & play golf packages

      Mytitle stay_& play_golf_packages

Почему это? Я ожидаю, что $Mytitle будет иметь значение «stay_&_play_golf_packages». Что тут происходит?

Любая помощь приветствуется!!!


person stdcerr    schedule 26.09.2012    source источник
comment
разбейте свой код на отдельные шаги и убедитесь, что вы действительно передаете то, что вы думаете. прямо сейчас вы прячете МНОГО вещей под капотом, передавая декодирование прямо в замену.   -  person Marc B    schedule 26.09.2012
comment
если у вас есть значение в пакете $head_title_array['title'] = Stay & play golf; это сработает... на самом деле, каково значение в $head_title_array['title'] .   -  person Ravichandran Jothi    schedule 26.09.2012


Ответы (2)


Вероятно, в вашей строке есть юникодные пробелы.

Возможное решение для вас - использовать preg_replace

preg_replace('/\p{Zs}/u', '_', $your_string);

Свойства символов Unicode

person Alexander Larikov    schedule 26.09.2012
comment
Ага, Спасибо! Это сделало это! Но не могли бы вы объяснить, пожалуйста. Я не очень умею пользоваться reg exp, и мне интересно, что означают \p, {Zs} и /u...? Спасибо! - person stdcerr; 26.09.2012
comment
@cerr /u предназначен для юникода, и, как вы можете найти по ссылке в моем ответе, \p{Zs} означает любой пробел. Так что это можно перевести как any whitespace in unicode string - person Alexander Larikov; 26.09.2012

Это не пробелы. Попробуйте заменить   и 0xA0.

person Ignacio Vazquez-Abrams    schedule 26.09.2012