RegEx for PHP将某个HTML标记之间的某个字符替换为另一个字符串


RegEx for PHP Replace certain character between certain HTML tag with another string

这是我在stackoverflow的第一篇文章,但我以前使用过这个令人惊叹的网站。

不管怎样,我不太擅长正则表达式,但我想我需要它们来做我需要做的事情

简短问题:我需要在<code></code>的任何出现之间用'&nbsp;'替换空间' '

更多详细信息:

这背后的动机是因为我的代码部分每隔一行就创建一行额外的行,因为有额外的空间(我是asuming)。通过用&nbsp;替换空格,我能够正确地格式化代码。

然而,这在我的HTML中引入了很多额外的字符。它不仅效率低下,而且使word-wrap: break-word;将单词一分为二,而不是将整个单词下移。

改为使用CSS:

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

请参阅white-space CSS属性­文档

首先,不是regex,而是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;}

或CCD_ 7/CCD_。

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

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

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

但我们假设您确实想使用regex来完成此操作。由于我认为我们可以假设使用<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);