正则表达式从链接中删除所有文件名

时间:2010-05-02 16:57:45

标签: javascript regex

我正在尝试编写一个从链接和图像中删除文件路径的正则表达式。

href="path/path/file" to href="file"
href="/file" to href="file"
src="/path/file" to src="file"

and so on...

我认为我有它工作,但如果它正在处理的字符串中有两个路径,它就会混乱。我觉得我的表情太贪心了。它找到整个字符串中的最后一个文件。

这是我的代码,显示了在测试输入上搞乱的表达式:

<script type="text/javascript" src="/javascripts/jquery.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        var s = '<a href="one/keepthis"><img src="/one/two/keep.this"></a>';
        var t = s.replace(/(src|href)=("|').*\/(.*)\2/gi,"$1=$2$3$2");
        alert(t);
    });
</script>

它给出了输出:

<a href="keep.this"></a>

正确的输出应该是:

<a href="keepthis"><img src="keep.this"></a>

感谢您的任何提示!

4 个答案:

答案 0 :(得分:0)

我建议运行单独的正则表达式替换,一个用于链接,另一个用于img,更容易和更清晰,因此更易于维护。

答案 1 :(得分:0)

这似乎适用于其他人有问题:

var t = s.replace(/(src|href)=('|")([^ \2]*\/)*\/?([^ \2]*)\2/gi,"$1=$2$4$2");

答案 2 :(得分:0)

尝试添加?以使*量词非贪婪。您希望它们在遇到结束引号字符时停止匹配。如果在字符串后面有另一个引用,那么贪婪的版本将会在结束引用之后立即敲响,找到最长的匹配;非贪婪的人会发现最短的可能匹配。

/(src|href)=("|').*?\/([^/]*?)\2/gi

此外,我将第二个.*更改为[^/]*,以允许第一个.*仍然匹配完整路径,因为它非贪婪。

答案 3 :(得分:0)

它不必是正则表达式(假设/分隔符):

var fileName = url.split('/').pop(); //pop takes the last element