繁体   English   中英

将前瞻性为负的正则表达式从PHP格式转换为Javascript格式

[英]Converting a regex with negative lookahead from a PHP format to a Javascript format

当浏览器不是IE时,我需要去除嵌入式换行符而不是段落换行符。

这样做的原因是很好地格式化警报消息。 事实证明,主要的非IE浏览器可以很好地自行格式化消息,并在合适的位置插入换行符。 但是,IE不会这样做。 因此,未格式化的行只会扩展警报框的宽度。 我的解决方案是使用IE的换行符格式化所有警报消息,并在浏览器不是IE时删除换行符。 无论使用什么浏览器,这都将提供格式合理的警报消息。 如果未执行此额外处理,则由于硬编码的换行符和浏览器添加的换行符同时存在,因此IE中的丑陋警告框(不带任何中断)或非IE浏览器中的文本格式参差不齐。

更为复杂的是,我不想剥离所有换行符,因为这样做也将删除段落换行符。 因此,最终要求是剥离所有单个换行符,而不是“段落”换行符,后者只是两个连续的换行符。

还有一个更复杂的问题是,字符串是用PHP处理的,这需要转义反斜杠。 因此,不是将换行符视为\\ n,而是\\\\ n,而正则表达式必须查找\\\\ n模式。

还请注意:我们大多数重要的“弹出消息和对话框”都是使用jquery完成的,以提供格式精美的显示。 因此,另一种方法是完全消除警报,并用jquery对话框替换它们。 但是,在这些情况下,我们不希望走得那么远,而只需要一个格式良好的警报框。

我们通常在PHP中进行正则表达式处理,效果很好。 问题是,如果可能的话,我还希望在纯JavaScript中提供等效处理。 我怀疑javascript中可能不支持负面的超前处理,至少在PHP中是不支持的。 如果是这样,那就增加了难度。 到目前为止,我还无法提供JavaScript版本。

这是达到预期效果的PHP代码:

/**
 * Removes embedded line breaks but not paragraph breaks if not IE
 *
 * @param string $message - formatted for IE, with embedded paragraph and line breaks
 * $is_IE - set elsewhere to indicate if the browser is IE
 */
function FormatAlert($message)
{
    global $is_IE;
    return ($is_IE) ?  $message : preg_replace('/(?<!\\\n)\\\n(?!\\\n)/', ' ', $message);
}

因此,需要为JavaScript创建一个等效的正则表达式。

在进一步思考中,发生在我身上的是,如果我可以提出一个正则表达式,那么解决方法是用特殊符号临时替换用于段落分隔符的双换行符,然后替换其余的单换行符,然后最后替换带双换行符的特殊符号。

Javascript支持否定先行,但不支持先行。

最初,我回答您可能不需要向后看: str.replace(/\\n(?!\\n)/g, ''); 这将删除所有新行,然后再不换行。 这对于您弹出警报的情况可能会很好,但是实际上它将删除双换行序列中的最后一个换行 (因为它后面没有换行),从而将双行的段落分隔符转换为简单的换行。 要解决此问题,您将需要使用另一个替换来替换其他换行符,方法是用已去除的多余字符替换任何左行: http : //jsfiddle.net/rgthree/99jCd/

var str = "This is an oddly\nbroken paragraph that\nwill turn"+
          "into one line.\n\nThis will still be a new\nand separate"+
          "paragraph that\nis also not broken.";    
str = str.replace(/\n(?!\n)/g, ' ').replace(/\n+\s/g, '\n\n');​

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM