2012-03-09 108 views
1

这是我第一次发布到stackoverflow,但我以前使用过这个令人惊叹的网站。用于PHP的RegEx替换某个HTML标记与另一个字符串之间的某个字符

无论如何,我吸取正则表达式,但我认为我需要他们为我需要做的。

简短的问题: 我需要'&nbsp;'更换的<code></code>任何发生之间的空间' '

更多细节:

这背后的动机是因为我的代码切片创建额外的线路,因为多余的空格(我asuming)的每个其他线路。通过用&nbsp;替换空格,我能够正确地格式化代码。

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

+0

您可以使用您的代码通过使用语法的问题。您还可以转义特定字符,以便它们出现在您的问题中。转义字符是'\\'。 – hakre 2012-03-09 00:55:13

回答

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); 
+0

在PHP中,'preg_replace_callback'可以让你将第一次和最后一次调用结合到'正则表达式' – 2012-03-09 02:05:13

+0

我尽力让正则表达式工作,但我不知道我在做什么(在这里插入科学狗模因)。我需要PHP版本的帮助,但不需要HTML代码标签,我需要找到BBCode代码标签[code]和[/ code],并获取这些标签之间的文本,以便我可以替换空格。 – 2012-03-09 20:31:05

+0

我最终得到了别人的帮助[链接] http://stackoverflow.com/questions/9640670/php-regex-get-text-between-bbcode-tags [/ link] – 2012-03-09 22:12:15

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解决方案具有复制&可粘贴性的优点。否则& nbsp-filled示例会给出“WTF !?”解析错误。

另外,还要确保您的CMS /标记转换器(如果你使用一个)不插入<br>自动将在<pre>/white-space:pre元素双线。

+0

那么,你如何插入' '与DOMDocument的部分实际上是缺少;) – hakre 2012-03-09 00:57:46

+0

好,现在它是明确的。 – Kornel 2012-03-09 01:02:13

+0

DOMDocument使用UTF-8编码。'“\ xa0”'是UTF-8的无效字符 - >'utf8“\ xA0”不映射到Unicode'。保重。 – hakre 2012-03-09 01:08:26

1

与CSS,而不是做它:

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

white-space CSS property­Docs

+0

我尝试了所有的不同的空白空间的CSS,他们都没有正确工作。我不确定发生了什么事。 – 2012-03-09 16:33:31

+0

您可能需要将'code'转换为block-mode:'code {display:block;}'或使用它的父元素。参见['code' HTML Element](https://developer.mozilla.org/en/HTML/Element/code)。 – hakre 2012-03-10 10:06:40

相关问题