这是我在stackoverflow的第一篇文章,但我以前使用过这个令人惊叹的网站。
不管怎样,我不太擅长正则表达式,但我想我需要它们来做我需要做的事情
简短问题:我需要在<code></code>
的任何出现之间用' '
替换空间' '
。
更多详细信息:
这背后的动机是因为我的代码部分每隔一行就创建一行额外的行,因为有额外的空间(我是asuming)。通过用
替换空格,我能够正确地格式化代码。
然而,这在我的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解决方案具有复制&可粘贴性。否则 填充的示例将给出"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", " ");
var result = Regex.Replace(input, "<code>(.*?)</code>", munged);