1

我正在尝试通过拆分给定的 URL 来使用正则表达式创建一个简单的面包屑:

输入是这种形式的 URL - http://someurl.com:1000/sites/Site1/Pages/Programs/Programs1/Programs2/SomePage.aspx?a=b;c=d

预期的输出是 - 你在这里:sites>Site1>Pages>Programs>Programs1>Programs2>SomePage

这是我使用的代码:

<script type="text/javascript">

var url ="http://someurl:1000/sites/Site1/Pages/Programs/Programs1/Programs2/SomePage.aspx?a=b;c=d"


var newURL = url.replace(new RegExp( "^(?:([^:/?#]+):)?(?://((?:(([^:@]*):?([^:@]*))?@)?([^:/?#]*)(?::(\\d*))?))?((((?:[^?#/]*/)*)([^?#]*))(?:\\?([^#]*))?(?:#(.*))?)", "g"),

  function( $0, $1, $2, $3, $4, $5, $6, $7, $8, $9){

  var domain = $1+ "://" + $2;
  var href = domain;
  var urlStrippedDown = $9;

  //Split the folders/pages within the path     /sites/Site1/Pages/Programs/Programs1/Programs2/SomePage.aspx
  var pieces = urlStrippedDown.replace( new RegExp (\\w+.aspx)|(\\w+),


  //Form the bread crumb with anchor tags and text
  function ($0, $1, $2)
  {

    zero = $0;
    var test =  "<a href='" + href +     urlStrippedDown.substring(0,urlStrippedDown.indexOf($0)+$0.length) +"'>" +     zero.replace('.aspx','')  + "</a>";
    return test;
  }
  );

  return pieces;
  }
);


//document.write("You are here: " + newURL.replace(/\//g,''));
document.write("You are here: " + newURL);

</script>

面临的问题:我面临的唯一问题是最终输出(newURL)在每个链接之间有一个正斜杠(“/”),我想用“>”替换,但这似乎是不可能的。我不确定这个“/”是如何插入的,尽管在“锚”标签形成时它没有将其显示为文本的一部分。

预期的输出是 - 你在这里:sites>Site1>Pages>Programs>Programs1>Programs2>SomePage

而我得到 - 你在这里:/sites/Site1/Pages/Programs/Programs1/Programs2/SomePage 我无法用“>”替换这个“/”

PS:注释的代码行 - 如果我在这里替换,它会替换所有“/”,甚至是锚标签内的那些。“/”应该在文本中替换,而不是在锚的href中

正则表达式有缺陷吗?有没有更好的方法来处理这个问题?

谢谢!

4

2 回答 2

0

试试这个模式,它会选择你所有的“\”符号作为你的要求,用你想要的替换它们

(\/)(?=[^\/:]*(\/|$))(?=[^\/])

(/)(?=[^/:]*(/|$)) 仅当 "/" 后跟除 "/" 和 : 下一个以 "/" 结尾的所有字符或行尾时匹配 "/"

于 2013-04-05T05:26:35.390 回答
0

您的第一个替换实际上没有任何其他目的,只是将字符串拆分为多个部分:域和路径,相反,您应该考虑RegExp.exec在字符串上使用并以这种方式获取部分(参见下面的代码段)。

您的newURL变量包含 html,您可以在正则表达式中利用和使用它。如果你替换 all /<a&gt; <a你应该有一个这样的字符串:> sites > Site1 > Pages > Programs > Programs1 > Programs2 > SomePage. 然后你必须删除第一个>,因为我想你不想要那个。

您的正则表达式对于您第一次匹配所需的内容似乎过于复杂,而您的第二次替换可能会更好地使用 aindexOf('/')和 a 循环,因为您并没有真正利用正则表达式匹配。

您将在下面找到一个函数,该函数使用与初始解决方案类似的方法为任意有效 URI 创建所需的链接链。由于修改了您的代码,我得到了这个,所以不发布它似乎是一种浪费。

var url = "http://someurl:1000/sites/Site1/Pages/Programs/Programs1/Programs2/SomePage.aspx?a=b;c=d";

function makeBreadcrumb(url){
    // Split match and split url into domain and path.
    var urlSplitter = new RegExp("^(.*?://[^/]+?/)([^?#:@]*)", "");
    var matcher;
    if (matcher = urlSplitter.exec(url)) {
        var domain = matcher[1];
        // Match every "folder" or "file" in the URI and replace with "breadcrumb link".
        return matcher[2].replace(new RegExp("([^/]+)(?:\\.[^\\.]+$|/)","g"),
            function(match,dir,pos,string) {
                return (pos > 0 ? " > " : "") + "<a href=\"" + domain + string.substring(0,pos) + match + "\">" + dir + "</a>";
            }
        );
    }
    return "";
}

document.write("You are here: " + makeBreadcrumb(url));
于 2013-04-05T10:37:25.787 回答