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() работи правилно. Търсих в Google и единственото нещо, за което можах да се сетя, беше моята 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; и други подобни са HTMLisms, методи за изразяване на специфични за набор от символи цифри в нещо, което е само текст. За да може 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 word, ето функция, която го замества (и други мерзости на MS word)

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