6

I need replace spaces with   inside HTML elements. Example:

<table atrr="zxzx"><tr>
<td>adfa a   adfadfaf></td><td><br /> dfa  dfa</td>
</tr></table>

should become

<table atrr="zxzx"><tr>
<td>adfa&nbsp;a&nbsp;&nbsp;&nbsp;adfadfaf></td><td><br />&nbsp;dfa&nbsp;&nbsp;dfa</td>
</tr></table>
5

3 Answers 3

9

If you're working with php, you can do

$content = str_replace(' ', '&nbsp;', $content);
Sign up to request clarification or add additional context in comments.

1 Comment

all spaces within attributes of html tags will be replaced as well
4

use regex to catch data between tags

(?:<\/?\w+)(?:\s+\w+(?:\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+)?)+\s*|\s*)\/?>([^<]*)?

then replace ' ' with '&nbsp;'

also to catch before and after html :

^([^<>]*)<?

>([^<>]*)$

Edit: here you go....

<?php
$data="dasdad asd a  <table atrr=\"zxzx\"><tr><td>adfa a   adfadfaf></td><td><br /> dfa  dfa</td></tr></table>  asdasd s ";
$exp="/((?:<\\/?\\w+)(?:\\s+\\w+(?:\\s*=\\s*(?:\\\".*?\\\"|'.*?'|[^'\\\">\\s]+)?)+\\s*|\\s*)\\/?>)([^<]*)?/";

$ex1="/^([^<>]*)(<?)/i";
$ex2="/(>)([^<>]*)$/i";

$data = preg_replace_callback($exp, function ($matches) {
    return $matches[1] . str_replace(" ", "&nbsp;", $matches[2]);
}, $data);
$data = preg_replace_callback($ex1, function ($matches) {
    return str_replace(" ", "&nbsp;", $matches[1]) . $matches[2];
}, $data);
$data = preg_replace_callback($ex2, function ($matches) {
    return $matches[1] . str_replace(" ", "&nbsp;", $matches[2]);
}, $data);

echo $data;
?>

it works... slightly modified but it would work without modifications (but i dont think youd understand the code ;) )

12 Comments

how is it not working for you ? -.-'''' what function do you use ?
i provided working php code. tell me if you have further problems
n00b32 i run you code. Result - changed data outside html tags. Table til content spaces. I use php 5.3.5
if you remove the second and third line begginin with '$data =' the code does exactly what you posted in your question... i use php 5.2.6-1+lenny9 so i think its consistent with your version
It's very strange but $exp not working, $ex1 and $ex2 is ok. preg_match return 0.
|
3

Since tokenizing HTML with regular expressions can be quite complicated (especially when allowing SGML quirks), you should use an HTML DOM parser like the one of PHP’s DOM library. Then you can query the DOM, get all text nodes and apply your replacement function on it:

$doc = new DOMDocument();
$doc->loadHTML($str);
$body = $doc->getElementsByTagName('body')->item(0);
mapOntoTextNodes($body, function(DOMText $node) { $node->nodeValue = str_replace(' ', '&nbsp;', $node->nodeValue); });

The mapOntoTextNodes function is a custom function I had defined in How to replace text URLs and exclude URLs in HTML tags?

2 Comments

isint this a bit of an overkill ? and if we are to overkill it we need to detect style/script etc etc tags...
I don't need to parse all html file. I need parse some parts like i posted in question.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.