Как заменить все пробелы внутри HTML-элементов с помощью preg_replace? - PullRequest
5 голосов
/ 06 марта 2011

Мне нужно заменить пробелы на   внутри элементов 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 ]

8 голосов
/ 06 марта 2011

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

$content = str_replace(' ', '&nbsp;', $content);
4 голосов
/ 06 марта 2011

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

(?:<\/?\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, 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;
?>

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

3 голосов
/ 06 марта 2011

Поскольку токенизация HTML с помощью регулярных выражений может быть довольно сложной (особенно при разрешении причуд SGML), вам следует использовать синтаксический анализатор HTML DOM, такой как PHP-библиотека DOM .Затем вы можете запросить 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 function - это пользовательская функция, которую я определил в Как заменить текстовые URL-адреса и исключить URL-адреса в тегах HTML?

...