此正则表达式查找具有3个或更少字符的单词,以便可以在它们之前放置不间断的空格。
smallwords = /(\s|^)(([a-zA-Z-_(]{1,2}('|’)*[a-zA-Z-_,;]{0,1}?\s)+)/gi, // words with 3 or less characters
有没有办法让表达式只适用于连续2个单词?
目前,字符串:
Singapore, the USA and Vietnam.
将变为:
Singapore, the USA and Vietnam.
如果表达式仅应用于连续的2个单词,则会显示
Singapore, the USA and Vietnam.
这是完整的脚本:
ragadjust = function (s, method) {
if (document.querySelectorAll) {
var eles = document.querySelectorAll(s),
elescount = eles.length,
smallwords = /(\s|^)(([a-zA-Z-_(]{1,2}('|’)*[a-zA-Z-_,;]{0,1}?\s)+)/gi, // words with 3 or less characters
while (elescount-- > 0) {
var ele = eles[elescount],
elehtml = ele.innerHTML;
if (method == 'small-words' || method == 'all')
// replace small words
elehtml = elehtml.replace(smallwords, function(contents, p1, p2) {
return p1 + p2.replace(/\s/g, ' ');
});
ele.innerHTML = elehtml;
}
}
};
答案 0 :(得分:0)
我知道这不是你要求的,但我认为代码审查不会受到影响:
\b
在这种情况下比\s|^
更好。A-Z
和a-z
个字符,但您使用i
不区分大小写的运算符。{0,1}?
是多余的 - 要么使用?
使其成为可选项,要么使用{0,1}
使其匹配为零或一次。[a-z_-]
比[a-z-_]
要好得多。< / LI>
(?:)
。所以,这是你的清理正则表达式:
/\b((?:[a-z_(-]{1,2}(?:'|’)*[a-z_,;-]?\s)+)/gi
我很确定当你从编辑器粘贴这个时,'|’
位是某种拼写错误。不确定它应该是什么。
答案 1 :(得分:0)
这并没有像你建议的那样解决问题,但它确实减少了最终在字符串中的非中断空格的数量。但它可能会给你一些见解。因为在两个正则表达式替换上都有尾随g
,所以您正在进行全局替换。如果你用一些最大数量的修复来循环它,那么事情会有所不同。
尝试更改最大替换次数。我认为在这里发生的另一件事(在我的修改后的代码中)是在你进行一次替换之后,空格和小单词都消失了,因为你堵塞了nbsp
这可能会或可能不会解决你的问题试图绕开。
这是我的替换功能(从原版中简化)。基本mod是从正则表达式中删除g
并添加循环。您应该查看codepen以查看完整的交易
var new_ragadjust = function (contents) {
MAX_NUMBER_OF_REPLACEMENTS = 5;
smallwords = /(\s|^)(([a-zA-Z-_(]{1,2}('|’)*[a-zA-Z-_,;]{0,1}?\s)+)/i; // words with 3 or less characters
var ii = 0;
var c = contents;
for (;ii < MAX_NUMBER_OF_REPLACEMENTS; ++ii) {
c = c.replace(smallwords, function(contents, p1, p2) {
return p1 + p2.replace(/\s/, ' ');
});
}
return c;
};
Codepen http://cdpn.io/DKLtc
另外,要看到差异,您需要检查元素以实际查看nbsp
最终的位置(您可能已经知道)。