Как поставить два пробела после каждой точки в нашем HTML?

Мне нужно, чтобы после каждой точки в каждом предложении на всем нашем сайте было два пробела (не спрашивайте).

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

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

Есть ли способ сделать это... и все еще работает в Internet Explorer 6?

[edit] - Сложность заключается в том, что в коде есть строки PHP, которые включают точки с пробелами вокруг них, например:

<?php echo site_url('/css/' . $some_name .'.css');?>

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


person SpaceNinja    schedule 07.10.2011    source источник
comment
помимо контекста PHP и Javascript, также многоточие (три точки), вероятно, не потребует пробела после каждой точки.   -  person stivlo    schedule 07.10.2011
comment
Нет, и вам не следует пытаться в первую очередь. (Если цель состоит в том, чтобы точно воспроизвести документ, тогда HTML — неправильный инструмент, если это не так, то вам не следует пытаться использовать устаревшие типографские соглашения).   -  person Quentin    schedule 07.10.2011
comment
@stivlo — Это не должно быть проблемой, потому что, если кому-то нужно многоточие, он будет использовать многоточие (), а не три точки (...), верно? (Нет, наверное, нет, вздох).   -  person Quentin    schedule 07.10.2011
comment
У вас уже есть два пробела после каждой точки, и вам просто нужно, чтобы они отображались при отображении страницы?   -  person thedaian    schedule 07.10.2011
comment
Это тот случай, когда я бы посоветовал бороться за правое дело и сказать им, что есть веская причина, по которой пробел + сжимается в пробел в HTML, и что практика двойного пробела после точки должна была умереть с изобретением пропорциональных шрифтов.   -  person steveax    schedule 07.10.2011
comment
Квентин, многоточие — это символ, унаследованный от Latin 1. Он не совсем нужен и лишает наборщика контроля над пробелами.   -  person Joey    schedule 07.10.2011


Ответы (5)


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

Вот метод разделения:

var el = document.getElementById("mydiv");
if (el){
    el.innerText = el.innerText.split(".").join(".\xA0 ");   
}

Прецедент:

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

Результат:

Привет, мир. Вставьте пробелы после точки. Использование метода разделения.

person James Johnson    schedule 07.10.2011
comment
Отредактировал мой ответ. Это то, что вы имели в виду? - person James Johnson; 07.10.2011

Как мы все знаем, HTML сворачивает пустое пространство, но делает это только для отображения. Лишние места все равно есть. Таким образом, если исходный материал был создан с двумя пробелами после каждой точки, то некоторые из этих предлагаемых методов замены могут работать надежно — найдите «точка-пробел-пробел» и замените его чем-то более подходящим, например точкой -пространство-. Обратите внимание, что вы не должны использовать, потому что это может помешать правильному переносу полей. (Если вы используете рваное право, изменение поля не будет заметным, пока вы используете nbsp ПЕРЕД пробелом.)

Вы также можете обернуть каждое предложение в диапазон и использовать селектор :after, чтобы добавить пробел и отформатировать его, чтобы он был широким с «межсловным интервалом». Или вы можете обернуть пространство между предложениями в промежуток и оформить его напрямую.

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

Если, однако, ваш исходный материал не включает такого рода вещи, вам придется изучить алгоритмы определения границ предложений (которые не так просты), а затем изменить один из них, чтобы он также не спотыкался о PHP-код.

person thomasafine    schedule 02.01.2013
comment
Поиск этого ответа, поскольку я разрабатываю приложение php/html/js для обмена сценарием. И палец вверх к этому комментарию - это путь. По какой-то причине в сценариях по-прежнему используются моноширинные шрифты, например courier. Производственный отдел говорит, что одна страница = одна минута экранного времени. А может, просто потому, что они к этому привыкли. Кто знает? В любом случае, он используется, поэтому я хотел бы поблагодарить тех, кто действительно ответил на вопрос. Для тех, кто возражает против того, чтобы задавать вопрос в первую очередь, я, к счастью, достиг предела своего характера, и поэтому не могу ничего сказать. - person Stigwood; 24.05.2021

Вы думали об использовании выходного буфера? ob_start($callback)

Не проверено, но если вы вставите это перед любым выводом (или еще лучше, разгрузите функцию):

<?php
    function processDots($buffer)
    {
      return (str_replace(".", ".&nbsp;", $buffer));
    }

    ob_start("processDots");
?>

и добавьте это в конец ввода:

<?php ob_end_flush(); ?>

Может просто работать :)

person Itai Sagi    schedule 07.10.2011
comment
теперь это точка и пробел, это не решение, очевидно, а идея для развития. - person Itai Sagi; 07.10.2011
comment
Я думаю, вы должны заменить только ., за которым следует пробел. Поскольку другие . обычно не заканчивают предложение. - person CodesInChaos; 07.10.2011

Если вы не против решения "постобработка"/"javascript":

var nodes = $('*').contents().map(function(a, b) {
    return (b.nodeType === Node.TEXT_NODE ? b : null);
});
$.each(nodes, function(i,node){
    node.data = node.data.replace(/(\.\s)/g, '.\u00A0\u00A0');
});

Использование jQuery для краткости, но не обязательно.

p.s. Я видел ваш комментарий о том, что не все периоды и пробелы следует рассматривать одинаково, но это настолько хорошо, насколько это возможно. в противном случае вам понадобится гораздо лучший/более пуленепробиваемый подход.

person Brad Christie    schedule 07.10.2011
comment
Это предотвратит разрыв строки после предложения. Вместо этого лучше использовать U+00A0 U+0020. - person Joey; 07.10.2011

Включите что-то подобное в свой файл PHP:

<?php if (preg_match('/^. [A-Z]$/' || '/^.  [A-Z]$/')) { preg_replace('. ', '.&nbsp; '); } ?>

Это позволяет вам искать начало каждого нового предложения, как в .spacespaceA-Z или .spaceA-Z, а затем заменять его на .&nbsp;space. [примечание: заглавная буква не заменяется]

person elbrant    schedule 04.01.2019