Я написал эту небольшую функцию несколько лет назад:
function sqlvprintf($query, $args)
{
global $DB_LINK;
$ctr = 0;
ensureConnection(); // Connect to database if not connected already.
$values = array();
foreach ($args as $value)
{
if (is_string($value))
{
$value = "'" . mysqli_real_escape_string($DB_LINK, $value) . "'";
}
else if (is_null($value))
{
$value = 'NULL';
}
else if (!is_int($value) && !is_float($value))
{
die('Only numeric, string, array and NULL arguments allowed in a query. Argument '.($ctr+1).' is not a basic type, it\'s type is '. gettype($value). '.');
}
$values[] = $value;
$ctr++;
}
$query = preg_replace_callback(
'/{(\\d+)}/',
function($match) use ($values)
{
if (isset($values[$match[1]]))
{
return $values[$match[1]];
}
else
{
return $match[0];
}
},
$query
);
return $query;
}
function runEscapedQuery($preparedQuery /*, ...*/)
{
$params = array_slice(func_get_args(), 1);
$results = runQuery(sqlvprintf($preparedQuery, $params)); // Run query and fetch results.
return $results;
}
Это позволяет запускать операторы в однострочном C # -ish String.Format, например:
runEscapedQuery("INSERT INTO Whatever (id, foo, bar) VALUES ({0}, {1}, {2})", $numericVar, $stringVar1, $stringVar2);
Он избегает использования типа переменной. Если вы попытаетесь параметризовать имена таблиц и столбцов, это будет терпеть неудачу, поскольку она помещает каждую строку в кавычки, которая является недопустимым синтаксисом.
ОБНОВЛЕНИЕ БЕЗОПАСНОСТИ: предыдущая версия str_replace
разрешала инъекции, добавляя токены {#} в пользовательские данные. Эта версия preg_replace_callback
не вызывает проблем, если замена содержит эти токены.
Пробелы уплотнены в HTML, потому что существует различие между тем, как HTML отформатирован и как это должно быть представлено. Рассмотрите страницу как это:
<html>
<body>
<a href="mylink">A link</a>
</body>
</html>
, Если бы HTML был расположен с отступом с помощью пробелов, например, ссылке предшествовали бы несколько пробелов.
Пытаться обратиться, "почему" это может быть, потому что HTML был основан SGML, который указал его тот путь. Это в свою очередь было основано GML с начала 60-х. Причина обработки пробела могла очень хорошо состоять в том, потому что данные вводились одна "карта" за один раз тогда, которая могла привести к нежелательному разрыву предложений и абзацев. Одно различие в старом GML - то, что он указал, что должно быть два пробелов между предложениями (как старые правила печатающего устройства), который, возможно, установил precedenct, который пробелы независимы от разметки.
Как другие сказали, это находится в спецификации HTML.
, Если Вы хотите сохранить пробел в выводе, можно использовать < pre> тег :
<pre>This text has extra spaces
and
newlines</pre>
, Но это будет также обычно отображать текст в другом шрифте.
"Почему несколько пробелов преобразовываются в одиночные пробелы?"
Первый, "почему" на вопросы трудно ответить. Это находится в спецификации. Это - в значительной степени конец его.
Полагают, что существует несколько видов пробела.
Пробел между тегами. <p>\n<b>hi</b>\n</p>
Пробел в содержании в теге. <p>Hi <i>everyone</i>.</p>
Пробел в разделе <pre>
или CDATA.
первые два трудно отличить. Пробел между тегами, даже в XML, является "дополнительным". Но когда Вы имеете то, что называют "смешанной моделью содержания" - тегами, смешанными с содержанием - в тонкости "между тегами" и "в содержании, но между тегами" и "в содержании, но не между тегами" невозможно разобраться.
, Таким образом, они не улаживают его. Пробел между тегами и пробел в содержании являются все дополнительными.
Не только это в спецификация , но существует некоторый смысл к нему. Если бы пробелы не были уплотнены, то необходимо было бы поместить весь HTML на одну строку. так что-то вроде этого:
<div>
<h1>Title</h1>
<p>
This is some text
<a href="#">Read More</a>
</p>
</div>
имел бы некоторое странное выравнивание с пробелами повсеместно. Единственный способ разобраться в нем состоял бы в том, чтобы уплотнить тот код, который будет трудно поддержать.
Если бы браузеры не сделали этого, то могло бы быть трудно отформатировать Ваш HTML-код для создания этого легко читаемым. Например, Вы могли бы хотеть форматировать свой код как это:
<html>
<body>
<div>
I like to indent all content that is inside div tags.
</div>
</body>
</html>
, Если браузер не игнорирует приблизительно восемь пробелов перед текстом в теге Div, Ваша веб-страница не могла бы посмотреть способ, которым Вы предназначили это для взгляда.
Это находится в спецификации HTML. Это - часть о междусловных пробелах, представляемых как пространство ASCII.
Простой, это находится в спецификации.
От спецификации HTML, раздел 9.1 :
, В частности, агенты пользователя должны свернуть входные последовательности пробела когда выходной междусловный пробел создания.
Ответить , почему это находится в спецификации для HTML? необходимо рассмотреть источники HTML.
Tim Berners-Lee разработал HTML для совместного использования научных документов. Он основывал его на существующих ранее идеях синтаксиса в SGML, который также имеет подобные обработки пробела.
можно предположить, что более ранние устройства записи HTML в CERN сделали так без помощи инструментов WYSIWYG, и таким образом, способность рассматривать пробел таким образом помогает четкости таких рукописных исходных файлов.
Существует также типографский ответ: слова и предложения должны иметь только одно пространство между ними, независимо от того, что Ваш вводящий учитель в школе, возможно, сказал Вам.
Используют Одно Пространство Между Предложениями
, Используют Пространство Отдельного слова Между Предложениями
Определение/спецификации HTML, ясно указанного для игнорирования избыточного пробела.
, Если Вы хотите включать дополнительные пространства, используйте или эти <pre>
тег или