【问题标题】:How replace all spaces inside HTML elements with   using preg_replace?如何使用 preg_replace 替换 HTML 元素中的所有空格?
【发布时间】:2011-03-06 11:49:40
【问题描述】:

我需要在 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>

【问题讨论】:

标签: php html preg-replace spaces


【解决方案1】:

如果你正在使用 php,你可以这样做

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

【讨论】:

  • html标签属性中的所有空格也会被替换
【解决方案2】:

使用正则表达式捕获标签之间的数据

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

然后将' '替换为'&amp;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;
?>

它可以工作...稍作修改,但无需修改即可工作(但我认为您不会理解代码;))

【讨论】:

  • 它怎么不适合你? -.-''''你用什么函数?
  • 我提供了工作 php 代码。如果您还有其他问题,请告诉我
  • n00b32 我运行你的代码。结果 - 更改了 html 标记之外的数据。表格直到内容空间。我使用 php 5.3.5
  • 如果你用'$data ='删除第二行和第三行begginin,代码完全符合你在问题中发布的内容......我使用php 5.2.6-1+lenny9,所以我认为它与你的版本
  • 很奇怪但是$exp不工作,$ex1和$ex2都可以。 preg_match 返回 0。
【解决方案3】:

由于使用正则表达式标记 HTML 可能非常复杂(尤其是在允许 SGML 怪癖时),您应该使用像 PHP’s DOM library 这样的 HTML 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 是我在How to replace text URLs and exclude URLs in HTML tags? 中定义的自定义函数

【讨论】:

  • 这是不是有点矫枉过正?如果我们要过度杀伤它,我们需要检测样式/脚本等标签......
  • 我不需要解析所有的html文件。我需要解析一些部分,就像我发布的问题一样。
猜你喜欢
  • 2011-10-06
  • 2019-06-23
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
相关资源
最近更新 更多