str_replace () не работает для следующего случая

Я хотел бы использовать str_replace() размещать элементы span вокруг строк html с целью их выделения.

Однако следующее не работает, когда есть   внутри строки. Я пытался заменить   с ' ' но это не помогло.


Живой пример

Вы можете воссоздать проблему, используя следующий код:

$str_to_replace = "as a way to incentivize more purchases.";

$replacement = "<span class='highlighter'>as a way to incentivize&nbsp;more purchases.</span>";

$subject = file_get_contents("http://venturebeat.com/2015/11/10/sources-classpass-raises-30-million-from-google-ventures-and-others/");

$output = str_replace($str_to_replace,$replacement,$subject);

.highlighter{
background-collor: yellow;
}

0

Решение

Поэтому я попробовал ваш код и столкнулся с той же проблемой, что и вы. Интересно, правда? Проблема в том, что на самом деле есть другой символ между «е» в «стимуле» и «больше», вы можете увидеть это, если вы сделаете это, разделить $subject на две части, предшествующие тексту to incentivize и после:

// splits the webpage into two parts
$x = explode('to incentivize', $subject);

// print the char code for the first character of the second string
// (the character right after the second e in incentivize) and also
// print the rest of the webpage following this mystery character
exit("keycode of invisible character: " . ord($x[1]) . " " . $x[1]);

который печатает: keycode of invisible character: 194 Â more ..., смотреть! Это наш загадочный персонаж, и у него есть код 194!

Возможно, этот сайт встраивает этих персонажей, чтобы затруднить выполнение именно того, что вы делаете, или, возможно, это просто ошибка. В любом случае вы можете использовать preg_replace вместо str_replace и изменить $str_to_replace вот так:

$str_to_replace = "/as a way to incentivize(.*?)more purchases/";

$replacement = "<span class='highlighter'>as a way to incentivize more purchases.</span>";

$subject = file_get_contents("http://venturebeat.com/2015/11/10/sources-classpass-raises-30-million-from-google-ventures-and-others/");

$output = preg_replace($str_to_replace,$replacement,$subject);

и теперь это делает то, что вы хотите. (.*?) обрабатывает таинственный скрытый персонаж. Возможно, вы можете уменьшить это регулярное выражение еще больше или, по крайней мере, ограничить его максимальным количеством символов ([.]{0,5}) но в любом случае вы, вероятно, хотите оставаться гибким.

1

Другие решения

Вы можете сделать это гораздо проще:

$subject = str_replace("\xc2\xa0", " ", $subject);

Который заменит все &nbsp; символы со стандартным пробелом.

Теперь вы можете продолжить с вашим кодом, но заменить все ваши &nbsp; с регулярным пространство

0

По вопросам рекламы [email protected]