Как мне поставить два пробела после каждого периода в нашем HTML? - PullRequest
7 голосов
/ 07 октября 2011

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

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

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

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

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

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

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

Ответы [ 5 ]

6 голосов
/ 02 января 2013

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

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

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

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

5 голосов
/ 07 октября 2011

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

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

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

Контрольный пример:

Hello world. Вставка пробелов после точки. Использование метода split.

Результат:

Hello world.Вставьте пробелы после периода.Используя метод разделения.

3 голосов
/ 07 октября 2011

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

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

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

    ob_start("processDots");
?>

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

<?php ob_end_flush(); ?>

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

2 голосов
/ 07 октября 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 для краткости, но не обязательно.

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

1 голос
/ 04 января 2019

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

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

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

...