【问题标题】:RegEx for PHP Replace certain character between certain HTML tag with another string用于 PHP 的 RegEx 将某些 HTML 标记之间的某些字符替换为另一个字符串
【发布时间】:2012-03-09 00:51:07
【问题描述】:

这是我在 stackoverflow 上的第一篇文章,但我以前使用过这个很棒的网站。

无论如何,我不擅长正则表达式,但我认为我需要它们来完成我需要做的事情。

小问题: 我需要在任何出现的<code></code> 之间用' ' 替换空格' '

更多详情:

这背后的动机是因为我的代码部分每隔一行创建了额外的行,因为额外的空格(我假设)。通过将空格替换为 ,我能够正确格式化代码。

但是,这在我的 HTML 中引入了很多额外的字符。它不仅效率低下,而且还使word-wrap: break-word; 将单词分成两半,而不是将整个单词向下移动。

【问题讨论】:

  • 您可以使用语法在您的问题中使用代码。您还可以转义特定字符,以便它们出现在您的问题中。转义字符是`\`。

标签: php html regex


【解决方案1】:

改为使用 CSS:

code {white-space: nowrap;} /* or */ code {white-space: pre;}

white-space CSS property­Docs

【讨论】:

  • 我尝试了所有不同的空白 css,但没有一个能正常工作。我不确定发生了什么。
  • 您可能需要将code 转换为块模式:code {display: block;} 或使用它的父元素。见code HTML Element
【解决方案2】:

首先,不是正则表达式,而是 DOM。在 PHP 中是:

foreach(DOMDocument::loadHTML($source)->getElementsByTagName('code') as $code) {
    foreach($code->childNodes as $node) {
       // assumes no elements, otherwise check nodeType == 3 
       // and recurse into elements
       $node->textContent = str_replace(" ","\xC2\xA0", $node->textContent);
    }
}

您可以(并且在 DOM 中需要)使用实际的空格字符而不是表示它的实体。

但是,这些额外的行可以通过以下方式更好地控制:

code {white-space: nowrap;}

white-space: pre/white-space: pre-line

CSS 解决方案具有可复制和可粘贴的优点。否则 &nbsp 填充的示例将给出“WTF!?”解析错误。

还要确保您的 CMS/标记转换器(如果您正在使用)不会自动插入 <br>,这会使 <pre>/white-space:pre 元素中的行加倍。

【讨论】:

  • 好吧,你如何用 DOMDocument 插入   的部分实际上是缺失的 ;)
  • DOMDocument 使用 UTF-8 编码。 "\xa0" 是 UTF-8 的无效字符 -> utf8 "\xA0" does not map to Unicode。保重。
  • 我不知道该把 DOM 代码放在哪里。我正在使用 CodeIgniter 框架。我不确定它是否可以轻松地与我加载视图和内容的方式一起使用。此外,我尝试了 CSS 更改,但这些更改也无法正常工作。 :-/ 我真的认为当 nbsp 存储在数据库中时,我需要一种方法来替换空格,但只能在代码标签之间。这就是当前系统的工作方式,如果采用这种结构,它可以完美呈现(我正在构建一个新系统,但正在传输现有数据)。
  • @hakre 啊,确实。我已经对它进行了 utf-8 化。我通常只是粘贴文字字符。
  • @Max Magee:此代码假定您在 $source 变量中拥有 HTML。 $doc = new DOMDocument(); $doc->loadHTML($source);$source = $doc->saveHTML(); 为您提供 2 向转换。
【解决方案3】:

免责声明:我认为这绝不是您必须达到的解决方案,这里已经有一些其他答案解决了您*应该/可以做些什么来完成您的任务。

但是让我们假设你确实想用正则表达式来做。因为我认为我们可以假设使用<code>stuff</code>,东西不会包含嵌套代码标签,你可以用它完成你的简短问题,但你仍然需要几个步骤:

//sorry for the c#, the but intent should translate clearly.
string input = @"<div>whatever</div> id='tricky'><code>adsfasd   fasdfasdfvar data = "" 8 5.00000000 8.0 9.000000"";var re = /(\.0{0,2})(0*)/g; var match = re.exec(data);alert(data.replace(re, RegExp.1));</code><p>more stuff with stuff.</p>";
var code = Regex.Match(input, "<code>(.*?)</code>").Value;
var munged = Regex.Replace(code, @"\s", "&nbsp;");
var result = Regex.Replace(input, "<code>(.*?)</code>", munged); 

【讨论】:

  • 在 php 中,preg_replace_callback 将允许您将第一次和最后一次调用合并到 Regex
  • 我尽我所能让正则表达式发挥作用,但我不知道我在做什么(在此处插入科学狗模因)。我需要有关 PHP 版本的帮助,但不是 HTML 代码标签,而是我需要找到 BBCode 代码标签 [code] 和 [/code] 并获取这些标签之间的文本,以便我可以替换空格。
  • 我最终在别人的帮助下得到了它 [link]stackoverflow.com/questions/9640670/…
  • 感谢您注意到这是完全相同的方法:)。再次,抱歉非 php。
猜你喜欢
  • 2011-02-21
  • 1970-01-01
  • 2018-08-23
  • 2018-12-11
  • 2019-06-21
  • 1970-01-01
  • 2022-07-15
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多