Как сопоставить символ '&' и заменить его в php - PullRequest
1 голос
/ 31 июля 2009

Моя основная проблема заключается в том, что на страницу поступает какой-то вывод с пробелом, записанным как " ". Я хочу заменить его обратно пробелом. Я пытался str_replace("&nbsp"," ",$mystr) и даже preg_replace("/( )/", " ", $mystr), но безрезультатно. Как мне это сделать? И вообще, если есть другие html-коды, поступающие в качестве вывода, например "&", есть ли способ заменить их фактическим выводом символов вместо html-кода?

Изменить: Позвольте мне прояснить несколько вещей здесь: я не хочу, чтобы люди вводили теги "" в источник редактируемой страницы. Чтобы предотвратить это, нам нужен механизм экранирования специальных символов. Но проблема в том, что некоторые действительные символы также экранированы. Я хочу убрать их, но также хочу убедиться, что безопасность не нарушена.

Ответы [ 10 ]

4 голосов
/ 31 июля 2009

Вы просто делаете это?

str_replace("&nbsp", " ", $mystr);

Или ты это делаешь?

$mystr = str_replace("&nbsp", " ", $mystr);

И str_replace, и preg_replace возвращают значение, они не меняют строку на месте.

2 голосов
/ 31 июля 2009

Посмотрите на функцию html_entity_decode .

2 голосов
/ 31 июля 2009

Я думаю, что вы ищете html_entity_decode.

1 голос
/ 31 июля 2009
<?php
   $string = "<p>Hello,& n b s p ;world</p>"; # Remove the spaces here - Stackoverflow bug doesn't let me enter the normal string.
   $string = str_replace("& n b s p ;", " ", $string);
   print $string;
?>

Это работает для меня. Возможно, вы ожидали, что она изменит строку вместо возврата измененной версии?

1 голос
/ 31 июля 2009

str_replace должен заменить эту часть текста, так как он не учитывает регулярные выражения, поэтому есть другая проблема, я думаю

0 голосов
/ 31 июля 2009

Поскольку конечная точка с запятой может быть пропущена, вы можете использовать регулярное выражение:

preg_replace("/&nbsp[;]?/", " ", $str)

Вы можете заменить [;]? на ;?. Но переполнение стека, похоже, заменяет &nbsp‍; (это написано с ZERO WIDTH JOINER U + 200D), поэтому я использовал [;]?.

0 голосов
/ 31 июля 2009

Посмотрите на Очиститель HTML . Дайте ему белый список разрешенных тегов / атрибутов, и он отфильтрует все для вас.

0 голосов
/ 31 июля 2009

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

0 голосов
/ 31 июля 2009

Вы пробовали:

$text=html_entity_decode(str_replace('& nbsp;',' ',$text));

[убрать пробел между амперсандом и nbsp: это связано с форматированием переполнения стека]

Он заменит неразрывные пробелы обычными пробелами, а затем расшифрует все остальные html-сущности.

0 голосов
/ 31 июля 2009

Я считаю, что функция, которую вы ищете - http://us2.php.net/manual/en/function.urldecode.php urldecode

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...