Я хотел бы использовать str_replace()
размещать элементы span вокруг строк html с целью их выделения.
Однако следующее не работает, когда есть
внутри строки. Я пытался заменить
с ' '
но это не помогло.
Живой пример
Вы можете воссоздать проблему, используя следующий код:
$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 = str_replace($str_to_replace,$replacement,$subject);
.highlighter{
background-collor: yellow;
}
Поэтому я попробовал ваш код и столкнулся с той же проблемой, что и вы. Интересно, правда? Проблема в том, что на самом деле есть другой символ между «е» в «стимуле» и «больше», вы можете увидеть это, если вы сделаете это, разделить $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})
но в любом случае вы, вероятно, хотите оставаться гибким.
Вы можете сделать это гораздо проще:
$subject = str_replace("\xc2\xa0", " ", $subject);
Который заменит все
символы со стандартным пробелом.
Теперь вы можете продолжить с вашим кодом, но заменить все ваши
с регулярным пространство