这是我在stackoverflow上的第一篇文章,但我之前使用过这个神奇的网站。
无论如何,我吮吸正则表达式,但我认为我需要它来做我需要做的事情。
简短问题:
我需要在任何' '
出现之间用' '
替换空格<code></code>
。
更多详情:
这背后的动机是因为我的代码部分每隔一行创建额外的行,因为有额外的空格(我很高兴)。通过用
替换空格,我能够正确格式化代码。
然而,这在我的HTML中引入了很多额外的字符。它不仅效率低下,而且还使word-wrap: break-word;
将单词分成两半而不是将整个单词向下移动。
答案 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;}
答案 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", " ");
var result = Regex.Replace(input, "<code>(.*?)</code>", munged);