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

Я написал эту небольшую функцию несколько лет назад:

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 не вызывает проблем, если замена содержит эти токены.

48
задан BoltClock 1 August 2017 в 18:42
поделиться

11 ответов

Пробелы уплотнены в HTML, потому что существует различие между тем, как HTML отформатирован и как это должно быть представлено. Рассмотрите страницу как это:

<html>
    <body>
        <a href="mylink">A link</a>
    </body>
</html>

, Если бы HTML был расположен с отступом с помощью пробелов, например, ссылке предшествовали бы несколько пробелов.

38
ответ дан tristan 7 November 2019 в 12:17
поделиться

Пытаться обратиться, "почему" это может быть, потому что HTML был основан SGML, который указал его тот путь. Это в свою очередь было основано GML с начала 60-х. Причина обработки пробела могла очень хорошо состоять в том, потому что данные вводились одна "карта" за один раз тогда, которая могла привести к нежелательному разрыву предложений и абзацев. Одно различие в старом GML - то, что он указал, что должно быть два пробелов между предложениями (как старые правила печатающего устройства), который, возможно, установил precedenct, который пробелы независимы от разметки.

17
ответ дан Turnkey 7 November 2019 в 12:17
поделиться

Как другие сказали, это находится в спецификации HTML.

, Если Вы хотите сохранить пробел в выводе, можно использовать < pre> тег :

<pre>This     text has              extra spaces

and

    newlines</pre>

, Но это будет также обычно отображать текст в другом шрифте.

15
ответ дан Zach Hirsch 7 November 2019 в 12:17
поделиться

"Почему несколько пробелов преобразовываются в одиночные пробелы?"

Первый, "почему" на вопросы трудно ответить. Это находится в спецификации. Это - в значительной степени конец его.

Полагают, что существует несколько видов пробела.

  • Пробел между тегами. <p>\n<b>hi</b>\n</p>

  • Пробел в содержании в теге. <p>Hi <i>everyone</i>.</p>

  • Пробел в разделе <pre> или CDATA.

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

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

12
ответ дан S.Lott 7 November 2019 в 12:17
поделиться

Не только это в спецификация , но существует некоторый смысл к нему. Если бы пробелы не были уплотнены, то необходимо было бы поместить весь HTML на одну строку. так что-то вроде этого:

<div>
    <h1>Title</h1>
    <p>
       This is some text
       <a href="#">Read More</a>
    </p>
</div>

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

11
ответ дан Community 7 November 2019 в 12:17
поделиться

Если бы браузеры не сделали этого, то могло бы быть трудно отформатировать Ваш HTML-код для создания этого легко читаемым. Например, Вы могли бы хотеть форматировать свой код как это:

<html>
<body>
    <div>
        I like to indent all content that is inside div tags.
    </div>
</body>
</html>

, Если браузер не игнорирует приблизительно восемь пробелов перед текстом в теге Div, Ваша веб-страница не могла бы посмотреть способ, которым Вы предназначили это для взгляда.

7
ответ дан Michael 7 November 2019 в 12:17
поделиться

Это находится в спецификации HTML. Это - часть о междусловных пробелах, представляемых как пространство ASCII.

http://www.w3.org/TR/html401/struct/text.html

3
ответ дан Chris Farmer 7 November 2019 в 12:17
поделиться

Простой, это находится в спецификации.

От спецификации HTML, раздел 9.1 :

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

3
ответ дан casperOne 7 November 2019 в 12:17
поделиться

Ответить , почему это находится в спецификации для HTML? необходимо рассмотреть источники HTML.

Tim Berners-Lee разработал HTML для совместного использования научных документов. Он основывал его на существующих ранее идеях синтаксиса в SGML, который также имеет подобные обработки пробела.

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

3
ответ дан Paul Dixon 7 November 2019 в 12:17
поделиться

Существует также типографский ответ: слова и предложения должны иметь только одно пространство между ними, независимо от того, что Ваш вводящий учитель в школе, возможно, сказал Вам.

Используют Одно Пространство Между Предложениями

, Используют Пространство Отдельного слова Между Предложениями

2
ответ дан Barry Brown 7 November 2019 в 12:17
поделиться

Определение/спецификации HTML, ясно указанного для игнорирования избыточного пробела.

, Если Вы хотите включать дополнительные пространства, используйте или эти <pre> тег или &nbsp;

2
ответ дан Sam Hasler 7 November 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: