str_replace не заменяет апострофы

Я прочитал здесь другой вопрос, посвященный этой же проблеме, и я не могу понять, что здесь происходит. Я пытаюсь заменить апостроф в своем коде на str_replace, и это не работает. У меня есть строка для проверки:

$clue_question = "If you’re rowin’ the Rhone from start to finish, you begin in this mountain range";

А затем некоторые строки заменяются и их результаты:

$new_string = str_replace("I", "a", $clue_question)."<br />";
//af you’re rowin’ the Rhone from start to finish, you begin in this mountain range

$another_new_string = str_replace("'", "VB", $clue_question)."<br />";
//If you’re rowin’ the Rhone from start to finish, you begin in this mountain range

$yet_another_new_string = str_replace("&#039;", "VB", $clue_question)."<br />";
//If you’re rowin’ the Rhone from start to finish, you begin in this mountain range

$sdf_another_new_string = str_replace("&#096;", "VB", $clue_question)."<br />";
//If you’re rowin’ the Rhone from start to finish, you begin in this mountain range

$sdf_another_new_string_sdf = str_replace("&#239;", "VB", $clue_question)."<br />";
//If you’re rowin’ the Rhone from start to finish, you begin in this mountain range

$yet_another = str_replace("’", "sdgd", $clue_question)."<br />";
//If you’re rowin’ the Rhone from start to finish, you begin in this mountain range

$yet_another = str_replace("\’", "sdgd", $clue_question)."<br />";
//If you’re rowin’ the Rhone from start to finish, you begin in this mountain range

Я пробовал эквиваленты ASCII, пытался экранировать их, пробовал нормально. Я понятия не имею, почему одиночный апостроф (или, возможно, это одинарная кавычка) не заменяется в моей строке. Мой синтаксис в порядке, потому что первая функция str_replace() работала правильно. Я погуглил, и единственное, о чем я мог подумать, это моя версия PHP после проверки другого вопроса здесь. Я запустил phpinfo() и у меня версия 5.2.17, поэтому я предполагаю, что проблема не в этом.

Любые идеи? Спасибо.


РЕДАКТИРОВАТЬ

Приношу свои извинения, у меня изначально был тип и начальная переменная как $question вместо $clue_question. Это был не тот случай. Я могу распечатать строки на экране и установить их правильно, это просто не форматирование. Спасибо за активность в этом вопросе!


person MillerMedia    schedule 02.06.2014    source источник
comment
просто чтобы убедиться, потому что в исходном примере это $question, а затем при обработке $clue_question они имеют одинаковое содержимое?   -  person user1978142    schedule 02.06.2014


Ответы (4)


Обратите внимание, что &#039; и тому подобное - это HTMLизмы, методы для выражения фигур, специфичных для набора символов, в чем-то, что является только текстом. Чтобы str_replace() понял &#039;, вам нужно преобразовать HTML в реальный набор символов.

Я не могу точно сказать, почему ваши попытки, отличные от HTML, терпят неудачу, но если ваши входные данные закодированы в наборе символов, который вы не хотите обрабатывать, то, возможно, вам нужно преобразовать что-то более легко управляемое.

<?php

$q = "If you’re rowin’ the Rhone\n";

print "Original:  " . $q;
print "Converted: " . iconv("UTF-8","ASCII//TRANSLIT",$q);

Для меня в xterm, который неправильно отображает UTF-8, это дает мне следующий результат:

Original:  If youâre rowinâ the Rhone
Converted: If you're rowin' the Rhone

Если вам сойдет с рук понижение вашего ввода до вещей, которые всегда ведут себя так, как ожидалось, вам может быть легче манипулировать ими.

Обратите внимание, что это НЕ общее решение для обработки специальных символов. Использование iconv() для ограничения набора символов может иметь непредвиденные последствия, такие как удаление символов, о которых вы не знали, что они особенные. Обращаться осторожно. Тщательно протестируйте. Всегда мойте руки после туалета.

person ghoti    schedule 02.06.2014
comment
Это помогло. Спасибо, что научили меня чему-то новому. Я понятия не имею, почему он не работает нормально (я никогда не сталкивался с этой проблемой раньше). Я буду обращаться с осторожностью :p - person MillerMedia; 03.06.2014

Похоже, вы определяете переменную с именем $question и выполняете замену переменной с именем $clue_question. Я только что проверил следующее, и он отлично работает.

<?php
$question = "If you’re rowin’ the Rhone from start to finish, you begin in this mountain range";
$another_new_string = str_replace("’", "VB", $question);
var_dump($another_new_string);
?>
person merlin2011    schedule 02.06.2014

Используйте переменную $question в функции str_replace() вместо $clue_question. Неверное имя переменной.

$question = "If you’re rowin’ the Rhone from start to finish, you begin in this mountain range";

echo $yet_another = str_replace("’", "sdgd", $question)."<br />";

Вывод:

If yousdgdre rowinsdgd the Rhone from start to finish, you begin in this mountain range
person Krish R    schedule 02.06.2014

Это очень старый вопрос, но он может быть полезен для других. Ужасная одинарная кавычка (апостроф) в моем случае была сгенерирована словом MS, вот функция, которая ее заменяет (и другие мерзости слова MS)

function msword_conversion($str)
{
    $str = str_replace(chr(130), ',', $str);    // baseline single quote
    $str = str_replace(chr(131), 'NLG', $str);  // florin
    $str = str_replace(chr(132), '"', $str);    // baseline double quote
    $str = str_replace(chr(133), '...', $str);  // ellipsis
    $str = str_replace(chr(134), '**', $str);   // dagger (a second footnote)
    $str = str_replace(chr(135), '***', $str);  // double dagger (a third footnote)
    $str = str_replace(chr(136), '^', $str);    // circumflex accent
    $str = str_replace(chr(137), 'o/oo', $str); // permile
    $str = str_replace(chr(138), 'Sh', $str);   // S Hacek
    $str = str_replace(chr(139), '<', $str);    // left single guillemet
// $str = str_replace(chr(140), 'OE', $str);   // OE ligature
    $str = str_replace(chr(145), "'", $str);    // left single quote
    $str = str_replace(chr(146), "'", $str);    // right single quote
// $str = str_replace(chr(147), '"', $str);    // left double quote
// $str = str_replace(chr(148), '"', $str);    // right double quote
    $str = str_replace(chr(149), '-', $str);    // bullet
    $str = str_replace(chr(150), '-–', $str);    // endash
    $str = str_replace(chr(151), '--', $str);   // emdash
// $str = str_replace(chr(152), '~', $str);    // tilde accent
// $str = str_replace(chr(153), '(TM)', $str); // trademark ligature
    $str = str_replace(chr(154), 'sh', $str);   // s Hacek
    $str = str_replace(chr(155), '>', $str);    // right single guillemet
// $str = str_replace(chr(156), 'oe', $str);   // oe ligature
    $str = str_replace(chr(159), 'Y', $str);    // Y Dieresis
    $str = str_replace('°C', '&deg;C', $str);    // Celcius is used quite a lot so it makes sense to add this in
    $str = str_replace('£', '&pound;', $str);
    $str = str_replace("'", "'", $str);
    $str = str_replace('"', '"', $str);
    $str = str_replace('–', '&ndash;', $str);

    return $str;
} 

Источник: https://www.php.net/manual/en/function.str-replace.php

person Robert Sinclair    schedule 21.08.2019