Как обернуть условие в кавычки php
Перейти к содержимому

Как обернуть условие в кавычки php

  • автор:

PHP обернуть строку в двойные кавычки

Я пытаюсь обернуть строку, введенную пользователем, в двойные кавычки для вывода, но я хочу убедиться, что я не получаю двойные двойные кавычки с обеих сторон строки. Например, если пользователь публикует

Я не хочу превращать его в

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

$string = '"'.trim($string,'"').'"'; 

Если у кого-то есть лучший способ сделать это, это будет здорово. Точно так же, если кто-нибудь может подтвердить, что мой путь в порядке, я буду счастлив. Спасибо

Rowan 12 окт. 2009, в 18:15
Поделиться
Где вы используете эту строку? Это HTML, Javascript или частичный SQL-запрос?
Ivan Nevostruev 12 окт. 2009, в 16:15

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

markus 12 окт. 2009, в 16:17
И: это цитата: ‘ — это двойная цитата » — вы используете эти термины немного неправильно.
markus 12 окт. 2009, в 16:18
извините, Таркун — плохая терминология с моей стороны. Я исправлю
Rowan 12 окт. 2009, в 16:19
Показать ещё 2 комментария
Поделиться:
optimization

5 ответов

Лучший ответ

Именно так я решил бы эту проблему. Стоит только беспокоиться о медленности кода, если у вас есть проблема с медленным приложением, и вы можете отследить его до инструкций trim.

Хорошо известная цитата программирования » Преждевременная оптимизация является корнем всего зла» — см. статью по Википедии, связанную для этого.

timmow 12 окт. 2009, в 17:06
Поделиться
Хорошая статья, я прочитаю. Спасибо
Rowan 12 окт. 2009, в 16:16

Внимательно изучите, что должно произойти со всеми случаями. (используя [] как кавычки для удобочитаемости)

Вы сказали, что вы делаете для [ «Привет» ], но что вы делаете для [Я сказал «Привет» , punk]? Вы по-прежнему лишаете введенные пользователем котировки или удаляете их? Или, может быть, сделайте еще один шаг и замените одинарные кавычки на двойные кавычки. но тогда вам придется учитывать случаи, когда пользовательский ввод содержит как одиночные, так и двойные кавычки! Как насчет того, когда пользователь вводит «грамматически неправильный» текст, например [ «Привет» (без закрытия цитаты!).

Лучший способ убедиться, что вы делаете это правильно — это сделать тестовый пример для каждого случая кромки, о котором вы можете подумать, и убедиться, что ваше предлагаемое решение действительно делает то, что ожидается.

Если фактическая причина этого требования — [я беру ввод пользователя в какой-то момент, а затем повторно показываю его в другой точке и не хочу показывать им такие глупые данные, как [ «данные» «]], вы, вероятно, просто захотите только удалить двойные кавычки с начала или конца входной строки, так как удалите их из средних винтов с данными пользователя.

Если ваша цель состоит в том, чтобы четко различать их ввод и текст, которые они не вводили, рассмотрите возможность использования других средств выделения, вместо кавычек. Поэтому вместо [вы ввели «данные» ], вы можете отобразить [вы ввели данные] или [вы ввели: данные], которые вообще избегают этой проблемы.

Brian Schroth 12 окт. 2009, в 17:25
Поделиться

+1 для тестов варианта использования, хороший момент, который мне стыдно было упустить в моем собственном ответе . = /

David Thomas 12 окт. 2009, в 18:53

Лично я предлагаю лишить цитаты на входе. Что бы сделать это быстрее, если вы позволяете вводить или сохранять кавычки, вы всегда будете придерживаться с помощью if / else перед их отображением.

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

David Thomas 12 окт. 2009, в 16:45
Поделиться

спасибо за ваш ответ, я согласен, но система, над которой я работаю, была частично собрана кем-то другим, так что мне придется работать с ужасными существующими данными . В конечном итоге я все это санирую!

Rowan 12 окт. 2009, в 16:18

Я сделал это следующим образом:

function quotize(&$string) < if (empty($string) || is_null($string)) < return; >$char = '"'; if ($string[0] != $char) < $string = $char . $string; >if (substr($string, -1) != $char) < $string .= $char; >return; > 

htmlspecialchars

В HTML некоторые символы имеют особый смысл и должны быть представлены в виде HTML-сущностей, чтобы сохранить их значение. Эта функция возвращает строку, над которой проведены эти преобразования. Если вам нужно преобразовать все возможные сущности, используйте htmlentities() .

Если входная строка, переданная в эту функцию и результирующий документ используют одинаковую кодировку символов, то этой функции достаточно, чтобы подготовить данные для вставки в большинство частей HTML-документа. Однако, если данные содержат символы, не определённые в кодировке символов результирующего документа и вы ожидаете сохранения этих символов (как числовые или именованные сущности), то вам недостаточно будет этой и htmlentities() функций (которые только преобразуют подстроки с соответствующими сущностями). Необходимо использовать функцию mb_encode_numericentity() .

Производятся следующие преобразования

Символ Замена
& (амперсанд) &
» (двойные кавычки) " , если не установлена ENT_NOQUOTES
‘ (одинарные кавычки) ' (для ENT_HTML401 ) или ' (для ENT_XML1 , ENT_XHTML или ENT_HTML5 ), но только если установлена ENT_QUOTES
< (меньше) <
> (больше) >

Список параметров

Битовая маска из нижеуказанных флагов, определяющих режим обработки кавычек, некорректных кодовых последовательностей и используемый тип документа. По умолчанию используется ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 .

Доступные значения параметра flags

Название константы Описание
ENT_COMPAT Преобразует двойные кавычки, одинарные кавычки не изменяются.
ENT_QUOTES Преобразует как двойные, так и одинарные кавычки.
ENT_NOQUOTES Оставляет без изменения как двойные, так и одинарные кавычки.
ENT_IGNORE Без всяких уведомительных сообщений отбрасывает некорректные кодовые последовательности вместо возврата пустой строки. Использование этого флага не рекомендуется, так как это может привести к » негативным последствиям, связанным с безопасностью.
ENT_SUBSTITUTE Заменяет некорректные кодовые последовательности символом замены Юникода U+FFFD в случае использования UTF-8 или � при использовании другой кодировки, вместо возврата пустой строки.
ENT_DISALLOWED Заменяет неверные коды символов для заданного типа документа символом замены юникода U+FFFD (UTF-8) или � (при использовании другой кодировки) вместо того, чтобы оставлять все как есть. Это может быть полезно, например, для того, чтобы убедиться в формальной правильности XML-документов со встроенным внешним контентом.
ENT_HTML401 Обработка кода в соответствии с HTML 4.01.
ENT_XML1 Обработка кода в соответствии с XML 1.
ENT_XHTML Обработка кода в соответствии с XHTML.
ENT_HTML5 Обработка кода в соответствии с HTML 5.

Необязательный аргумент, определяющий кодировку, используемую при конвертации символов.

Если не указан, то значение по умолчанию для encoding зависит от конфигурационной опции default_charset.

Хотя этот аргумент является технически необязательным, настоятельно рекомендуется указать правильное значение для вашего кода, опция конфигурации default_charset может быть задана неверно для входных данных.

Для целей этой функции кодировки ISO-8859-1 , ISO-8859-15 , UTF-8 , cp866 , cp1251 , cp1252 и KOI8-R являются практически эквивалентными, предполагая то, что сама строка string содержит корректные символы в указанной кодировке, то символы, изменяемые htmlspecialchars() , останутся на тех же местах во всех этих кодировках.

Поддерживаются следующие кодировки:

Поддерживаемые кодировки

Кодировка Псевдонимы Описание
ISO-8859-1 ISO8859-1 Западно-европейская Latin-1.
ISO-8859-5 ISO8859-5 Редко используемая кириллическая кодировка (Latin/Cyrillic).
ISO-8859-15 ISO8859-15 Западно-европейская Latin-9. Добавляет знак евро, французские и финские буквы к кодировке Latin-1 (ISO-8859-1).
UTF-8 8-битная Unicode, совместимая с ASCII.
cp866 ibm866, 866 Кириллическая кодировка, применяемая в DOS.
cp1251 Windows-1251, win-1251, 1251 Кириллическая кодировка, применяемая в Windows.
cp1252 Windows-1252, 1252 Западно-европейская кодировка, применяемая в Windows.
KOI8-R koi8-ru, koi8r Русская кодировка.
BIG5 950 Традиционный китайский, применяется в основном на Тайване.
GB2312 936 Упрощённый китайский, стандартная национальная кодировка.
BIG5-HKSCS Расширенная Big5, применяемая в Гонконге.
Shift_JIS SJIS, SJIS-win, cp932, 932 Японская кодировка.
EUC-JP EUCJP, eucJP-win Японская кодировка.
MacRoman Кодировка, используемая в Mac OS.
» Пустая строка активирует режим определения кодировки из файла скрипта (Zend multibyte), default_charset и текущей локали (смотрите nl_langinfo() и setlocale() ) в указанном порядке. Не рекомендуется к использованию.

Замечание: Остальные кодировки не поддерживаются, вместо них будет применена кодировка по умолчанию и сгенерировано предупреждение.

Если параметр double_encode выключен, то PHP не будет преобразовывать существующие html-сущности. По умолчанию преобразуется все без ограничений.

Возвращаемые значения

Если входная строка string содержит неверную последовательность символов в указанной кодировке encoding , то будет возвращаться пустая строка в случае, если флаги ENT_IGNORE или ENT_SUBSTITUTE не установлены.

Список изменений

Версия Описание
8.1.0 Значение по умолчанию параметра flags изменено с ENT_COMPAT на ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 .

Примеры

Пример #1 Пример использования htmlspecialchars()

Примечания

Замечание:

Обратите внимание, что функция не производит других преобразований, кроме описанных выше. Для преобразования всех HTML-сущностей используйте htmlentities() .

  • Если одновременно отсутствуют константы ENT_COMPAT , ENT_QUOTES и ENT_NOQUOTES , по умолчанию будет использоваться ENT_NOQUOTES .
  • Если одновременно присутствуют две или более констант ENT_COMPAT , ENT_QUOTES и ENT_NOQUOTES , ENT_QUOTES будет иметь больший приоритет. Следующая по приоритету будет ENT_COMPAT .
  • Если нет ни одной из констант ENT_HTML401 , ENT_HTML5 , ENT_XHTML и ENT_XML1 , по умолчанию будет использоваться ENT_HTML401 .
  • Если одновременно присутствуют две или более констант ENT_HTML401 , ENT_HTML5 , ENT_XHTML , ENT_XML1 , то приоритет будет таким: ENT_HTML5 , потом ENT_XHTML , ENT_XML1 , а потом ENT_HTML401 .
  • Если одновременно присутствуют две или более констант ENT_DISALLOWED , ENT_IGNORE , ENT_SUBSTITUTE , высшим приоритетом будет обладать ENT_IGNORE , а следующая за ней ENT_SUBSTITUTE .

Смотрите также

  • get_html_translation_table() — Возвращает таблицу преобразований, используемую функциями htmlspecialchars и htmlentities
  • htmlspecialchars_decode() — Преобразовывает специальные HTML-сущности обратно в символы
  • strip_tags() — Удаляет теги HTML и PHP из строки
  • htmlentities() — Преобразовывает все возможные символы в соответствующие HTML-сущности
  • nl2br() — Вставляет HTML-код разрыва строки перед каждым переводом строки

User Contributed Notes 21 notes

10 years ago

As of PHP 5.4 they changed default encoding from «ISO-8859-1» to «UTF-8». So if you get null from htmlspecialchars or htmlentities

where you have only set
echo htmlspecialchars ( $string );
echo htmlentities ( $string );
?>

you can fix it by
echo htmlspecialchars ( $string , ENT_COMPAT , ‘ISO-8859-1’ , true );
echo htmlentities ( $string , ENT_COMPAT , ‘ISO-8859-1’ , true );
?>

On linux you can find the scripts you need to fix by

grep -Rl «htmlspecialchars\\|htmlentities» /path/to/php/scripts/

10 years ago

Unfortunately, as far as I can tell, the PHP devs did not provide ANY way to set the default encoding used by htmlspecialchars() or htmlentities(), even though they changed the default encoding in PHP 5.4 (*golf clap for PHP devs*). To save someone the time of trying it, this does not work:

ini_set ( ‘default_charset’ , $charset ); // doesn’t work.
?>

Unfortunately, the only way to not have to explicitly provide the second and third parameter every single time this function is called (which gets extremely tedious) is to write your own function as a wrapper:

define ( ‘CHARSET’ , ‘ISO-8859-1’ );
define ( ‘REPLACE_FLAGS’ , ENT_COMPAT | ENT_XHTML );

function html ( $string ) return htmlspecialchars ( $string , REPLACE_FLAGS , CHARSET );
>

echo html ( «ñ» ); // works
?>

You can do the same for htmlentities()

1 year ago

Because the documentation says

int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401

you would think that ENT_HTML401 is important. But as the notes mention, ENT_HTML401 is the default if you don’t specify the doc type. This is because ENT_HTML401 === 0. So

int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401

is exactly equivalent to

int $flags = ENT_QUOTES | ENT_SUBSTITUTE

15 years ago

if your goal is just to protect your page from Cross Site Scripting (XSS) attack, or just to show HTML tags on a web page (showing on the page, for example), then using htmlspecialchars() is good enough and better than using htmlentities(). A minor point is htmlspecialchars() is faster than htmlentities(). A more important point is, when we use htmlspecialchars($s) in our code, it is automatically compatible with UTF-8 string. Otherwise, if we use htmlentities($s), and there happens to be foreign characters in the string $s in UTF-8 encoding, then htmlentities() is going to mess it up, as it modifies the byte 0x80 to 0xFF in the string to entities like é. (unless you specifically provide a second argument and a third argument to htmlentities(), with the third argument being «UTF-8»).

The reason htmlspecialchars($s) already works with UTF-8 string is that, it changes bytes that are in the range 0x00 to 0x7F to < etc, while leaving bytes in the range 0x80 to 0xFF unchanged. We may wonder whether htmlspecialchars() may accidentally change any byte in a 2 to 4 byte UTF-8 character to < etc. The answer is, it won’t. When a UTF-8 character is 2 to 4 bytes long, all the bytes in this character is in the 0x80 to 0xFF range. None can be in the 0x00 to 0x7F range. When a UTF-8 character is 1 byte long, it is just the same as ASCII, which is 7 bit, from 0x00 to 0x7F. As a result, when a UTF-8 character is 1 byte long, htmlspecialchars($s) will do its job, and when the UTF-8 character is 2 to 4 bytes long, htmlspecialchars($s) will just pass those bytes unchanged. So htmlspecialchars($s) will do the same job no matter whether $s is in ASCII, ISO-8859-1 (Latin-1), or UTF-8.

13 years ago

i searched for a while for a script, that could see the difference between an html tag and just < and >placed in the text,
the reason is that i recieve text from a database,
wich is inserted by an html form, and contains text and html tags,
the text can contain < and >, so does the tags,
with htmlspecialchars you can validate your text to XHTML,
but you’ll also change the tags, like to <b>,
so i needed a script that could see the difference between those two.
but i couldn’t find one so i made my own one,
i havent fully tested it, but the parts i tested worked perfect!
just for people that were searching for something like this,
it may looks big, could be done easier, but it works for me, so im happy.

function fixtags ( $text ) $text = htmlspecialchars ( $text );
$text = preg_replace ( «/=/» , «=\»\»» , $text );
$text = preg_replace ( «/"/» , «"\»» , $text );
$tags = «/<(\/|)(\w*)(\ |)(\w*)([\\\=]*)(?|(\»)\»"\»|)(?|(.*)?"(\»)|)([\ ]?)(\/|)>/i» ;
$replacement = «» ;
$text = preg_replace ( $tags , $replacement , $text );
$text = preg_replace ( «/=\»\»/» , » keyword»>, $text );
return $text ;
>
?>

an example:

I hope its helpfull!!

2 years ago

One MUST specify ENT_HTML5 in addition to double_encode=false to avoid double-encoding.

The reason is that contrary to the documentation, double_encode=false will NOT unconditionally and globally prevent double-encoding of ALL existing entities. Crucially, it will only skip double-encoding for THOSE character entities that are explicitly valid for the document type chosen!

Since ENT_HTML5 references the most expansive list of character entities, it is the only setting that will be most lenient with existing character entities.

declare( strict_types = 1 );
$text = ‘ampersand(&), double quote("), single quote('), less than(<), greater than(>), numeric entities(&"'<>), HTML 5 entities(+,!$(ņ€)’ ;
$result3 = htmlspecialchars ( $text , ENT_NOQUOTES | ENT_SUBSTITUTE , ‘UTF-8’ , /*double_encode*/ false );
$result4 = htmlspecialchars ( $text , ENT_NOQUOTES | ENT_XML1 | ENT_SUBSTITUTE , ‘UTF-8’ , /*double_encode*/ false );
$result5 = htmlspecialchars ( $text , ENT_NOQUOTES | ENT_XHTML | ENT_SUBSTITUTE , ‘UTF-8’ , /*double_encode*/ false );
$result6 = htmlspecialchars ( $text , ENT_NOQUOTES | ENT_HTML5 | ENT_SUBSTITUTE , ‘UTF-8’ , /*double_encode*/ false );

HTML 5 (recognizes «all» valid character entities):
ampersand(&), double quote(«), single quote(‘), less than(<), greater than(>), numeric entities(&»‘<>), HTML 5 entities(+,!$(ņ€)

1 year ago

Thanks Thomasvdbulk for your workaround, I would like to add a precision:

When the HTML contains a link tag without new line before the script doesn’t work :/

$text = preg_replace ( ‘/ ?>

I don’t like that but I don’t find other solution. :/

10 years ago

Another thing important to mention is that
htmlspecialchars(NULL)
returnes an empty string and not NULL!

12 years ago

Be careful, the «charset» argument IS case sensitive. This is counter-intuitive and serves no practical purpose because the HTML spec actually has the opposite.

4 years ago

If you use htmlspecialchars() to escape any HTML attribute, make sure use double quote instead of single quote for the attribute.

> Wrap with Single Quote
echo «

// title will end up Hello»s\ and rest of the text after single quote will be cut off.
?>

> Wrap with Double quote :
echo ‘

. htmlspecialchars ( «Hello\»s\’world» ) . ‘»‘ >

// title will show up correctly as Hello»s’world
?>

14 years ago

Just a few notes on how one can use htmlspecialchars() and htmlentities() to filter user input on forms for later display and/or database storage.

1. Use htmlspecialchars() to filter text input values for html input tags. i.e.,

2. Use htmlentities() to filter the same data values for most other kinds of html tags, i.e.,

3. Use your database escape string function to filter the data for database updates & insertions, for instance, using postgresql,

pg_query($connection,»UPDATE datatable SET datavalue='».pg_escape_string($data).»‘»);

This strategy seems to work well and consistently, without restricting anything the user might like to type and display, while still providing a good deal of protection against a wide variety of html and database escape sequence injections, which might otherwise be introduced through deliberate and/or accidental input of such character sequences by users submitting their input data via html forms.

14 years ago

This may seem obvious, but it caused me some frustration. If you try and use htmlspecialchars with the $charset argument set and the string you run it on is not actually the same charset you specify, you get any empty string returned without any notice/warning/error.

$ok_utf8 = «A valid UTF-8 string» ;
$bad_utf8 = «An invalid UTF-8 string» ;

var_dump ( htmlspecialchars ( $bad_utf8 , ENT_NOQUOTES , ‘UTF-8’ )); // string(0) «»

var_dump ( htmlspecialchars ( $ok_utf8 , ENT_NOQUOTES , ‘UTF-8’ )); // string(20) «A valid UTF-8 string»

?>

So make sure your charsets are consistent

$bad_utf8 = «An invalid UTF-8 string» ;

// make sure it’s really UTF-8
$bad_utf8 = mb_convert_encoding ( $bad_utf8 , ‘UTF-8’ , mb_detect_encoding ( $bad_utf8 ));

var_dump ( htmlspecialchars ( $bad_utf8 , ENT_NOQUOTES , ‘UTF-8’ )); // string(23) «An invalid UTF-8 string»

?>

I had this problem because a Mac user was submitting posts copy/pasted from a program and it contained weird chars in it.

8 years ago

Be aware of the encoding of your source files.

Some of the suggestions here make reference to workarounds where you hard-code an encoding.

echo htmlspecialchars ( ‘Wörmann‘ ); // Why isn’t this working?
?>

As it turns out, it may actually be your text editor that is to blame.

As of PHP 5.4, htmlspecialchars now defaults to the UTF-8 encoding. That said, many text editors default to non-UTF encodings like ISO-8859-1 (i.e. Latin-1) or WIN-1252. If you change the encoding of the file to UTF-8, the code above will now work (i.e. the ö is encoded differently in UTF-8 and ISO-8859-1, and you need the UTF-8 version).

Make sure you are editing in UTF-8 Unicode mode! Check your UI or manual for how to convert files to Unicode. It’s also a good idea to figure out where to look in your UI to see what the current file encoding is.

15 years ago

I was recently exploring some code when I saw this being used to make data safe for «SQL».

This function should not be used to make data SQL safe (although to prevent phishing it is perfectly good).

Here is an example of how NOT to use this function:

$username = htmlspecialchars ( trim ( » $_POST [ username ] » ));

$uniqueuser = $realm_db -> query ( «SELECT `login` FROM `accounts` WHERE `login` = ‘ $username ‘» );
?>

(Only other check on $_POST[‘username’] is to make sure it isn’t empty which it is after trim on a white space only name)

The problem here is that it is left to default which allows single quote marks which are used in the sql query. Turning on magic quotes might fix it but you should not rely on magic quotes, in fact you should never use it and fix the code instead. There are also problems with \ not being escaped. Even if magic quotes were used there would be the problem of allowing usernames longer than the limit and having some really weird usernames given they are to be used outside of html, this just provide a front end for registering to another system using mysql. Of course using it on the output wouldn;t cause that problem.

Another way to make something of a fix would be to use ENT_QUOTE or do:

$uniqueuser = $realm_db -> query ( ‘SELECT `login` FROM `accounts` WHERE `login` keyword»>. $username . ‘»;’ );
?>

Eitherway none of these solutions are good practice and are not entirely unflawed. This function should simply never be used in such a fashion.

I hope this will prevent newbies using this function incorrectly (as they apparently do).

22 years ago

Actually, if you’re using >= 4.0.5, this should theoretically be quicker (less overhead anyway):

10 years ago

In many PHP legacy products the function htmlspecialchars($string) is used to convert characters like < and >and quotes a.s.o to HTML-entities. That avoids the interpretation of HTML Tags and asymmetric quote situations.

Since PHP 5.4 for $string in htmlspecialchars($string) utf8 characters are expected if no charset is defined explicitly as third parameter in the function. Legacy products are mostly in Latin1 (alias iso-8859-1) what makes the functions htmlspecialchars(), htmlentites() and html_entity_decode() to return empty strings if a special character, e. g. a German Umlaut, is present in $string:

echo htmlspecialchars(‘Woermann‘) //Output: <b>Woermann<b>
echo htmlspecialchars(‘Wörmann’) //Output: <b>Wörmann<b>

echo htmlspecialchars(‘Woermann‘) //Output: <b>Woermann<b>
echo htmlspecialchars(‘Wörmann‘) //Output: empty

Three alternative solutions

a) Not runnig legacy products on PHP 5.4
b) Change all find spots in your code from
htmlspecialchars($string) and *** to
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, ‘ISO-8859-1’)
c) Replace all htmlspecialchars() and *** with a new self-made function

*** The same is true for htmlentities() and html_entity_decode();

1 Make Search and Replace in the concerned legacy project:
Search for: htmlspecialchars
Replace with: htmlXspecialchars
Search for: htmlentities
Replace with: htmlXentities
Search for: html_entity_decode
Replace with: htmlX_entity_decode
2a Copy and paste the following three functions into an existing already everywhere included PHP-file in your legacy project. (of course that PHP-file must be included only once per request, otherwise you will get a Redeclare Function Fatal Error).

function htmlXspecialchars($string, $ent=ENT_COMPAT, $charset=’ISO-8859-1′) return htmlspecialchars($string, $ent, $charset);
>

function htmlXentities($string, $ent=ENT_COMPAT, $charset=’ISO-8859-1′) return htmlentities($string, $ent, $charset);
>

function htmlX_entity_decode($string, $ent=ENT_COMPAT, $charset=’ISO-8859-1′) return html_entity_decode($string, $ent, $charset);
>

or 2b crate a new PHP-file containing the three functions mentioned above, let’s say, z. B. htmlXfunctions.inc.php and include it on the first line of every PHP-file in your legacy product like this: require_once(‘htmlXfunctions.inc.php’).

13 years ago

I had problems with spanish special characters. So i think in using htmlspecialchars but my strings also contain HTML.
So I used this 🙂 Hope it help

function htmlspanishchars ( $str )
<
return str_replace (array( «<» , «>» ), array( «» ), htmlspecialchars ( $str , ENT_NOQUOTES , «UTF-8» ));
>
?>

16 years ago

also see function «urlencode()», useful for passing text with ampersand and other special chars through url

(i.e. the text is encoded as if sent from form using GET method)

and if the link is followed, the $_GET[«text»] in foo.php will contain «foo?&bar!»

10 years ago

For those having problems after the change of default value of $encoding argument to UTF-8 since PHP 5.4.

The idea — you override the built-in htmlspecialchars() function with your customized variant which is able to respect non UTF-8 default encoding. This small piece of code can be then easily inserted somewhere at the start of yout project. No need to rewrite all htmlspecialchars() entries globally.

I’ve spent several hours with both approaches. Variant 1 looks good especaially in combination with http://www.php.net/manual/en/function.rename-function.php as it allows to call original htmlspecialchars() with just altered default args. The code could be as follows:

rename_function ( ‘htmlspecialchars’ , ‘renamed_htmlspecialchars’ );
function overriden_htmlspecialchars ( $string , $flags = NULL , $encoding = ‘cp1251’ , $double_encode = true ) $flags = $flags ? $flags : ( ENT_COMPAT | ENT_HTML401 );
return renamed_htmlspecialchars ( $string , $flags , $encoding , $double_encode );
>
override_function ( ‘htmlspecialchars’ , ‘$string, $flags, $encoding, $double_encode’ , ‘return overriden_htmlspecialchars($string, $flags, $encoding, $double_encode);’ );
?>

Unfortunatelly this didn’t work for me properly — my site managed to call overriden function but not every time I reloaded the pages. Moreover other PHP sites crashed under my Apache server as they suddenly started blaming htmlspecialchars() was not defined. I suppose I had to spend more time to make it work thread/request/site/whatever-safe.

So I switched to runkit (variant 2). It worked for me, although even after trying runkit_function_rename()+runkit_function_add() I didn’t managed to recall original htmlspecialchars() function. So as a quick solution I decided to call htmlentities() instead:

function overriden_htmlspecialchars ( $string , $flags = NULL , $encoding = ‘UTF-8’ , $double_encode = true ) $flags = $flags ? $flags : ( ENT_COMPAT | ENT_HTML401 );
$encoding = $encoding ? $encoding : ‘cp1251’ ;
return htmlentities ( $string , $flags , $encoding , $double_encode );
>
runkit_function_redefine ( ‘htmlspecialchars’ , ‘$string, $flags, $encoding, $double_encode’ , ‘return overriden_htmlspecialchars($string, $flags, $encoding, $double_encode);’ );
?>

You may be able to implement your more powerfull overriden function.
Good luck!

PHP: Кавычки

В этом уроке мы разберем, что такое строки, зачем для них нужны одинарные и двойные кавычки. Также узнаем, что такое экранирующие последовательности и конкатенация.

Что такое строка

Любой одиночный символ в кавычках — это строка. Например:

'Hello' 'Goodbye' 'G' ' ' '' 

Пустая строка » — это тоже строка. То есть строкой мы считаем все, что находится внутри кавычек, даже если это пробел, один символ или вообще отсутствие символов.

Ранее в уроках мы записывали строки в одинарных кавычках, но можно использовать и двойные:

Разберем, почему у обозначения строки есть два способа.

Зачем нужны двойные кавычки

Представим, что нам нужно напечатать строчку dragon’s mother . Апостроф перед буквой s — это такой же символ, как одинарная кавычка. Попробуем:

Такая программа не будет работать. С точки зрения PHP строчка началась с одинарной кавычки, а потом закончилась после буквы n. Дальше были символы s mother без кавычек — значит, это не строка. А потом была одна открывающая строку кавычка, которая так и не закрылась: ‘); . Этот код синтаксически некорректен.

Здесь помогут двойные кавычки. Такой вариант программы отработает корректно:

Теперь интерпретатор знает, что строка началась с двойной кавычки, значит, завершиться должна на двойной кавычке. А одинарная кавычка внутри стала частью строки.

Верно и обратное. Если внутри строки мы хотим использовать двойные кавычки, то саму строку надо делать в одинарных. Причем количество кавычек внутри самой строки неважно.

Теперь представим, что мы хотим создать такую строку:

Dragon's mother said "No" 

В ней есть и одинарные, и двойные кавычки. В этой ситуации нужно указать интерпретатору, что нужно считать каждую кавычку частью строки, а не началом или концом.

Для этого экранируют специальные символы. В нашем случае это символ, который является признаком конца и начала строки, — либо одинарная кавычка, либо двойная, в зависимости от ситуации. Для экранирования используется обратный слеш \ .

 Dragon's mother said "No" 

Нам нужно было добавить \ для двойных кавычек, но не для апострофа, потому что сама строка создана с двойными кавычками. Если бы строка создавалась с одинарными кавычками, то символ экранирования нужен был бы перед апострофом, но не перед двойными кавычками.

 Death is \so terribly final 

Также нам может понадобиться вывести сам обратный слеш:

Это тоже можно сделать через экранирование, но уже самого себя.

Задание

Напишите программу, которая выведет на экран:

"Khal Drogo's favorite word is "athjahakar"" 

Программа должна вывести на экран эту фразу в точности. Обратите внимание на кавычки в начале и в конце фразы:

"Khal Drogo's favorite word is "athjahakar""

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

PHP переменная с кавычками внутри двойных кавычек

окей. у вас есть в коде пример с available=\»true\» . Почему вы не можете сделать точно также и с другим атрибутом?

28 апр 2021 в 12:06
он динамический в виде php переменной $py[‘product_id’]
28 апр 2021 в 12:07

заменяете все ‘ на \» и получается точно так же как с \»true\» . а переменную $py[‘product_id’] не трогать

28 апр 2021 в 12:10

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Вам нужно проэкранировать двойные кавычки, как вы сделали с available=\»true\» :

$yml = "" . $this->eol; 

Отслеживать
ответ дан 28 апр 2021 в 12:16
Roman Grinyov Roman Grinyov
3,867 4 4 золотых знака 23 23 серебряных знака 58 58 бронзовых знаков
да рабочий вариант ..
28 апр 2021 в 12:19

в случае конкатенации проще всю строку завернуть в одинарные, а не двойные,тогда экранировать не надо. В случаев двойных, проще вписать переменную прямо в строку, избежав конкатенации.

28 апр 2021 в 12:19

На самом деле есть много вариантов для строки. Они все описаны в документации в разделе строки. Там описаны и варианты с HEREDOC/NOWDOC и с подстановкой переменных и с экранированием и различия одинарных кавычек от двойных и подстановка управляющих последовательностей в виде \n \t и т.д.

Я хотел было написать тут варианты решения, но подумал, что их будет очень много и проще будет прочитать именно раздел работы со строками, чем копировать 25 скроллов документации. Это намного полезнее

Отслеживать
ответ дан 28 апр 2021 в 12:20
Алексей Шиманский Алексей Шиманский
72.4k 12 12 золотых знаков 92 92 серебряных знака 180 180 бронзовых знаков

  • php
  • кавычки
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.2.16.5008

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *