Я использую wordpress в качестве CMS и пытаюсь ввести поля пользователя для заполнения информационных окон в сценарии Google Map. Я использую это, чтобы выбрать идентификатор и вытащить содержимое из настраиваемого поля.
Он отлично работает, если в пользовательском поле отсутствует какой-либо html, который разбивает скрипт.
Я посмотрел на htmlspcialchar и htmlentities, но вместо того, чтобы вырезать все, я бы хотел, чтобы он сбежал, так что он все еще работает, и html не поврежден. Какие-либо предложения? Я довольно новичок в PHP и очень ценю любые указатели.
Через некоторое время я все еще не могу найти отличное решение для этого. TheDeadMedic предложил использовать esc_js
но это напечатало весь фактический html-код вместо его рендеринга.
Спасибо nickfs, поскольку это решение было немного лучше, но сценарий все еще ломается, если в выходе есть какие-либо возвраты каретки, что делает это не очень хорошим для CMS.
Что-то еще, что я пробовал, – это использовать функцию обрезки. Здесь я нахожусь там, где он работает до тех пор, пока на выходе не будет. Строка $ snip, поле mapExcerpt – это результат возврата:
<?php $post_id = 207; // WordPress Post ID $my_post = get_post($post_id); $mapTitle = $my_post->post_title; $mapIMG = get_post_meta($post_id, 'mapImage', true); $snip = get_post_meta($post_id, 'mapExcerpt', true); $lat = get_post_meta($post_id, 'lat', true); $long = get_post_meta($post_id, 'long', true); $pass_to = '<div class="span-8"><div class="mapTitle">'.$mapTitle.'</div><div class="mapContent">'.$snip.'</div></div>'; $trimmed = trim($pass_to, " \r."); ?> var point = new GLatLng('<?php echo $lat; $lat; ?>','<?php echo $long; $long; ?>'); var marker = createMarker(point,"<?php echo $mapTitle; $mapTitle; ?>", '<?php echo addslashes($trimmed); ?>'); map.addOverlay(marker);
Любые другие идеи о том, как я могу это сделать?
Я не совсем понимаю вашу точную проблему, но ответ на название вашего вопроса довольно прост:
$snip = str_replace('.', '', $snip); // remove dots $snip = str_replace(' ', '', $snip); // remove spaces $snip = str_replace("\t", '', $snip); // remove tabs $snip = str_replace("\n", '', $snip); // remove new lines $snip = str_replace("\r", '', $snip); // remove carriage returns
Или все в одном решении:
$snip = str_replace(array('.', ' ', "\n", "\t", "\r"), '', $snip);
Вы также можете использовать регулярные выражения:
$snip = preg_replace('~[[:cntrl:]]~', '', $snip); // remove all control chars $snip = preg_replace('~[.[:cntrl:]]~', '', $snip); // above + dots $snip = preg_replace('~[.[:cntrl:][:space:]]~', '', $snip); // above + spaces
Вам все равно придется использовать addslashes()
для вывода $snip
внутри Javascript.
Я всегда использую это, чтобы избавиться от досадных возвратов каретки:
$string = str_replace("\r\n", "\n", $string); // windows -> unix $string = str_replace("\r", "\n", $string); // remaining -> unix
Поскольку вы помещаете это в Javascript, вам нужно избегать его для строк javascript. addslashes()
должен делать трюк.
Попробуйте JSON-кодирование, я всегда это делаю, когда отправляю данные с PHP на Javascript. Он решает большинство проблем с кодировкой, включая новые строки.
Используйте собственный esc_js()
WP, который будет избегать кавычек и разрывов строк для строк JavaScript.
Это единственное решение, которое работало для меня:
$dataWithoutCarrierReturn = preg_replace('/[\x0D]/', '', $inData);
если вам нужно удалить новые строковые символы всех типов (в utf8)
$dataWithoutCarrierReturn = preg_replace('/\R/', '', $inData);