.tolowercase()只有文字除了URL?

时间:2017-04-09 06:03:46

标签: javascript jquery

我一直在为Greasemonkey编写这个脚本。问题是.tolowercase()显然它将大小写为小写,这会打破URL。我已经研究过.startswith()和.endswith()作为可能的解决方案,例如以http和https开头;也许前缀检测一些'http *'?无论如何,这是下面的代码,提前感谢:

// ==UserScript==
// @name        twitter intent
// @namespace   random
// @description twitter intent popupwindow text replace
// @include     https://twitter.com/intent/*
// @version     1
// @grant       none
// @require     http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js
// ==/UserScript==


$('#status').each(function() {
    var text = $(this).text();
    $(this).text(text.toLowerCase()
        .replace('... ', ' ... ')
        .replace('health ', '#health ')
        .replace('video', 'Video')
        .replace('emergency', '#emergency')
        .replace('climate change', '#climatechange')
        .replace('climate ', '#climate ')
    );      
});

这是在代码运行之前的HTML。

<textarea id="status" name="status" required="" autofocus="" aria-required="true" aria-describedby="post-error char-count">EPA shuts down program helping states adjust to climate change http://hill.cm/FH2iWpq</textarea>

编辑:重要的是,除了网址之外的文字是大写或小写被忽略但仍然.replace文本,如果检测到自己的单词。

4 个答案:

答案 0 :(得分:1)

尝试将文本解析为网址,如果有效,请不要小写:

你可以看到它在我制作的小提琴中起作用 - Updated codepen

text = text.split(' ');

text.forEach(function (value, index) {
    try {
        var url = new URL(value);
    } catch (ex) {
        text[index] = value.toLowerCase();
    }
});

text = text.join(' ');

答案 1 :(得分:1)

所以我尝试过放置位置,网址和重新附加它的组合。

最终结果如下:

$('#status').each(function() {
    var text = $(this).text();
    var n = text.indexOf('http');
    var url = text.match('http(s?):\/\/[^<\s]*');
    if(url){
        text = text.replace(url[0],'')
    }
    text = text.toLowerCase()
        .replace('... ', ' ... ')
        .replace('health ', '#health ')
        .replace('video', 'Video')
        .replace('emergency', '#emergency')
        .replace('climate change', '#climatechange')
        .replace('climate ', '#climate ')
    if(url){
        text = text.slice(0,n) + url[0] + text.slice(n);
    }
    $(this).text(text);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id="status" name="status" required="" autofocus="" aria-required="true" aria-describedby="post-error char-count">EPA shuts down program helping states adjust to climate change http://hill.cm/FH2iWpq</textarea>

答案 2 :(得分:0)

为什么不能使用正则表达式查找某些字符串是从 <key>UIApplicationShortcutItems</key> <array> <dict> <key>UIApplicationShortcutItemIconType</key> <string>UIApplicationShortcutIconTypeHome</string> <key>UIApplicationShortcutItemTitle</key> <string>Home</string> <key>UIApplicationShortcutItemType</key> <string>com.emmetarries.Tabbed-Test.home</string> </dict> <dict> <key>UIApplicationShortcutItemIconType</key> <string>UIApplicationShortcutIconTypeLatest</string> <key>UIApplicationShortcutItemTitle</key> <string>Latest Photo</string> <key>UIApplicationShortcutItemType</key> <string>com.emmetarries.Tabbed-Test.latestPhoto</string> </dict> </array> 还是https://开始,然后不要在其上应用http://

toLowerCase

因此,您可以创建一个函数来检查字符串是否为URL,然后对非URL字符串执行const regex = /^(https:\/\/)/g; const str = `https://www.FaceBook.com`; let m; while ((m = regex.exec(str)) !== null) { // This is necessary to avoid infinite loops with zero-width matches if (m.index === regex.lastIndex) { regex.lastIndex++; } // The result can be accessed through the `m`-variable. m.forEach((match, groupIndex) => { console.log(`Found match, group ${groupIndex}: ${match}`); }); }

如果您正在寻找,请告诉我。

OP显示一些代码

后更新

我仍然相信正则表达式是你的解决方案

这是更新后的代码段

toLowerCase

正如您所看到的,除了URL之外,所有内容都是小写的。

答案 3 :(得分:0)

var dictionary1= {
    " A":" b",
    " B":" b",
    " C":" C",
};

jQuery(document).ready(function() {
    setTimeout(function() {
$("#status").each( function(){
    for( var ptrn in dictionary1){
        $(this).text( $(this).text().replace(new RegExp(ptrn ,"g"), dictionary1[ptrn] ) );
    }
});
}, 100);
});