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

时间:2012-03-09 00:51:08

标签: php html regex

这是我在stackoverflow上的第一篇文章,但我之前使用过这个神奇的网站。

无论如何,我吮吸正则表达式,但我认为我需要它来做我需要做的事情。

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

更多详情:

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

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

3 个答案:

答案 0 :(得分:1)

首先,不是正则表达式,而是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解决方案具有复制和可粘贴性的优势。否则,充实的例子会给出“WTF!?”解析错误。

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

答案 1 :(得分:1)

用CSS代替:

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

请参阅white-space CSS property­Docs

答案 2 :(得分:0)

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

但是我们假设你想用正则表达式来做这件事。因为我认为我们可以假设使用<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);