开发者

How do I put two spaces after every period in our HTML?

I need there to be two spaces after every period in every sentence in our entire site (don't ask).

One way to do it is to embark on manually adding a &nbsp  after every single period. This will take several hours.

We can't just find and replace every period, because we have concatenations in PHP and other cases where there is a period and then a space, but it's not in a sentence.

Is there a way to do this...and everything still work in Internet Explorer 6?

[edit] - The tricky part is that in the code, there are lines of PHP that include dots with spaces around them like this:

&l开发者_如何学JAVAt;?php echo site_url('/css/' . $some_name .'.css');?>

I definitely don't want extra spaces to break lines like that, so I would be happy adding two visible spaces after each period in all P tags.


As we all know, HTML collapses white space, but it only does this for display. The extra spaces are still there. So if the source material was created with two spaces after each period, then some of these substitution methods that are being suggested can be made to work reliably - search for "period-space-space" and replace it with something more suituble, like period-space- . Please note that you shouldn't use   because it can prevent proper wrapping at margins. (If you're using ragged right, the margin change won't be noticeable as long as you use the the nbsp BEFORE the space.)

You can also wrap each sentence in a span and use the :after selector to add a space and format it to be wide with "word-spacing". Or you can wrap the space between sentences itself in a span and style that directly.

I've written a javascript solution for blogger that does this on the fly, looks for period-space-space, and replaces it with a spanned, styled space that appears wider.

If however your original material doesn't include this sort of thing then you'll have to study up on sentence boundary detection algorithms (which are not so simple), and then modify one to also not trip over PHP code.


You might be able to use the JavaScript split method or regex depending on the scope of the text.

Here's the split method:

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

Test case:

Hello world.Insert spaces after the period.Using the split method.

Result:

Hello world. Insert spaces after the period. Using the split method.


Have you thought using output buffer? ob_start($callback)

Not tested, but if you'll stick this before any output (or betetr yet, offload the function):

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

    ob_start("processDots");
?>

and add this to end of input:

<?php ob_end_flush(); ?>

Might just work :)


If you're not opposed to a "post processing"/"javascript" solution:

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');
});

Using jQuery for the sake of brevity, but not required.

p.s. I saw your comment about not all periods and a space are to be treated equal, but this is about as good as it gets. otherwise, you're going to need a lot better/more bullet-proof approach.


Incorporate something like this into your PHP file:

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

This allows you to search for the beginning of each new sentence as in .spacespaceA-Z, or .spaceA-Z and then replaces that with .&nbsp;space. [note: Capital letter is not replaced]

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜