Как заменить все пробелы внутри HTML-элементов с помощью preg replace?


Мне нужно заменить пробелы на   внутри HTML-элементов. Пример:

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

Должно стать

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

3 ответа:

Используйте регулярное выражение для перехвата данных между тегами

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

Затем замените ' ' на '&nbsp;'

Также поймать до и после html:

^([^<>]*)<?

>([^<>]*)$

Править: вот, держи....

<?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, create_function('$matches','return $matches[1].str_replace(" ","&nbsp;",$matches[2]);'), $data);
$data = preg_replace_callback($ex1, create_function('$matches','return str_replace(" ","&nbsp;",$matches[1]).$matches[2];'), $data);
$data = preg_replace_callback($ex2, create_function('$matches','return $matches[1].str_replace(" ","&nbsp;",$matches[2]);'), $data);

echo $data;
?>

Это работает... немного изменено, но это будет работать без изменений (но я не думаю, что вы понимаете код ;))

Если вы работаете с php, вы можете сделать

$content = str_replace(' ', '&nbsp;', $content);

Поскольку маркировка HTML регулярными выражениями может быть довольно сложной (особенно при разрешении SGML-причуд), вы должны использовать синтаксический анализатор HTML DOM, подобный тому, который используется в библиотеке DOM PHP. Затем вы можете запросить DOM, получить все текстовые узлы и применить к нему функцию замены:

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

mapOntoTextNodes функция - это пользовательская функция, которую я определил в Как заменить текстовые URL-адреса и исключить URL-адреса в HTML-тегах?