【问题标题】:javascript regex to replace url of certain length withjavascript正则表达式替换一定长度的url
【发布时间】:2010-08-24 03:05:34
【问题描述】:

我想要一个正则表达式,它将长 url 替换为 ...,例如,

我传入一个带有 url 的字符串,即

<a href="http://www.abc.com/thisSite/myPages/blah-blah-blah.aspx">http://www.abc.com/thisSite/myPages/blah-blah-blah.aspx</a>

应该转换成

<a href="http://www.abc.com/thisSite/myPages/blah-blah-blah.aspx">http://www.abc.com/th....</a>

如有任何帮助,将不胜感激。

【问题讨论】:

  • 您可以通过缩进 4 个空格将 HTML 作为文本发布,从而使其成为“代码”或“预格式化”。迷你编辑器中还有一个按钮,可以缩进选定的第 4 行空格块(标签为 1010101 的那个)
  • 非常感谢您的帮助... :)
  • 您是否在使用任何库(例如 JQuery 等)?您是从服务器脚本(例如 PHP)生成 HTML 吗?最好从服务脚本本身解决这个问题,除非您从 Ajax 调用中获取 URL,因此库...
  • 不,我从服务调用中获取内容,并在 javaScript 中生成 HTML .. 所以它不能在服务器中完成...... :(
  • 您是直接从服务调用中以 HTML 形式检索内容,还是您正在解析的 XML 或用于创建锚标记的 JSON?

标签: javascript html


【解决方案1】:

jQuery

$('a').each(function(){
   var text = $(this).text();
   if (text.length > 20 && text.substr(0,7) == "http://"){ // it looks like a URL and it's long
      text = text.substr(0,20) + '&hellip;';
      $(this).text(text);
   }

});

普通的javascript

var links = document.getElementsByTagName('a');
for (var i = 0;i=links.length-1;i++) {
   var text = links[i].innerHTML;
   if (text.length > 20 && text.substr(0,7) == "http://"){ // it looks like a URL and it's long
      text = text.substr(0,20) + '&hellip;';
      links[i].innerHTML = text;
   }
}

我不知道这是否有效,因为我是从脑海中写出来的。 玩得开心。

【讨论】:

  • 仅供参考:as 是保留字。你需要改变它。
【解决方案2】:

基于this solution,您可以这样做:

String.prototype.trunc =
     function(n,useWordBoundary,wordChar){
         if (!wordChar) wordChar = ' ';
         var toLong = this.length>n,
             s_ = toLong ? this.substr(0,n-1) : this;
         s_ = useWordBoundary && toLong ? s_.substr(0,s_.lastIndexOf(wordChar)) : s_;
         return toLong ? s_ + '&hellip;' : s_;
     };

然后简单地将其应用于显示链接的锚点:

var maxLength = 40;
var aElements = document.getElementsByTagName('a'), _text, _param;
var aLen = aElements.length;

for (var i=0; i<aLen; i++) {
   _text = aElements[i].innerHTML;
   // remove url params
   if (0 <= (_param = _text.indexOf('?'))) {
      _text = _text.substr(0, _param - 1);
   }
   if (0 == _text.indexOf('http://') && _text.length > maxLength) {
      _text = _text.trunc(maxLength);
      // _text = _text.trunc(maxLength, true, '/'); 
   }
   aElements[i].innerHTML = _text;
}

【讨论】:

  • 我想说不要理会网址参数等;只需使用trunc 截断文本节点。
  • 对于最终用户来说,不看到 URL 参数更漂亮......但话又说回来,它们可能是需要/必需的。在任何情况下,IF 块都可以简单地被注释(或以另一个参数为条件......)
【解决方案3】:

您需要使用以下代码

<script>
var cutOffAt = 20;
var anchorRef = getAnchorFromDom();
var text = anchorRef.innerHtml;
if(text.length > 20) {
  anchorRef.innerHtml = text.substr(0, cutOffAt);
}

function getAnchorFromDom()
{
  // provide your own logic here
  return document.getElementsByTagName('a')[0];
}
</script>

未经测试。

【讨论】:

    【解决方案4】:

    在这里,我在想你实际上想使用正则表达式并且从未提到过 jquery .. headslap ...

    var s = '<a href="http://www.abc.com/thisSite/myPages/blah-blah-blah.aspx">http://www.abc.com/thisSite/myPages/blah-blah-blah.aspx</a>';
    var t = s.replace(/(<a [^>]*>)([^<]{1,20})([^<]*)(<\/a>)/, function(str, p1, p2, p3, p4) { return p1 + p2 + (p3.length ? '...' : '') + p4; });
    document.write(t);
    

    http://jsfiddle.net/5kSzL/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 2016-09-23
      • 1970-01-01
      • 2013-01-22
      • 2014-01-26
      相关资源
      最近更新 更多