Regex 正则表达式帮助-url中的目录

Regex 正则表达式帮助-url中的目录,regex,perl,Regex,Perl,我有如下网址 <a href="http://cdn1.xyz.com/testone/2010/a.jpg"> <a href="http://cdn2.xyz.com/testtwo/2010/a.jpg"> 或。与该格式匹配的正则表达式是什么 谢谢。试试: $url =~ m{([^:]*://.*?\.[a-z]*?/[^/]*)/.*}; 我可能建议寻找与URL匹配的regexp模块。这是一项很常见的任务,有时甚至是很困难的任务,有些软件包可能做得很好。如果

我有如下网址

<a href="http://cdn1.xyz.com/testone/2010/a.jpg">
<a href="http://cdn2.xyz.com/testtwo/2010/a.jpg">
或。与该格式匹配的正则表达式是什么

谢谢。

试试:

$url =~ m{([^:]*://.*?\.[a-z]*?/[^/]*)/.*};
我可能建议寻找与URL匹配的regexp模块。这是一项很常见的任务,有时甚至是很困难的任务,有些软件包可能做得很好。如果你的需求真的很简单,你可以保证url的简单性,尽管我不会打扰你

if ($string =~ m{([^:]+://[^/]+/[^/]+)}) {
  print $1;
} else {
  print 'no match';
}

也可以试试这个。

如果需要从HTML中提取链接,请使用类似的方法来处理该部分

URL是非常复杂的事情,而且越来越复杂。您使用的正则表达式将不可避免地出错。您可以使用URI模块解析URL,然后对其进行修改

use URI;
my $uri = URI->new($url_string);
现在我们有了$uri作为一个对象,我们可以只得到路径部分,并更改它以切掉我们不想要的任何东西

# Get the path already split into pieces
my @path = $uri->path_segments;

# Put just the first bit back, also clear the query 
$uri->path_query($path[0]);

# clear any "#foo" it might have
$uri->fragment(undef);

现在,$uri就是您想要的。它的字符串重载,因此您可以将$uri用作字符串。

不太好,但效果很好

$url='<a href="http://cdn1.xyz.com/testone/2010/a.jpg">';
$url =~ m|(\w+)://([^/:]+)(:\d+)?/(.*)|;
$aa=$4;
($aa)=split('\/',$aa);
$wanted=$1.'://'.$2.'/'.$aa;
print $wanted;
$url='';
$url=~m |(\w+):/([^/:]+)(:\d+)/(.*)|;
$aa=$4;
($aa)=拆分(“\/”,$aa);
$WARNED=$1.'://'.$2.'/'.$aa;
印刷$通缉令;

品脱<代码>http://cdn1.xyz.com/testone

不能再依赖字母数字域名了。或者它是a.com。这在很多方面都很糟糕(显式协议、显式域、不完整的URL字符集)--但不会投反对票,太小的代表:)@Schwern@Nick:谢谢你指出这一点,只是稍微编辑了一下这篇文章。我根据OP的例子做了一些假设。这是怎么回事?这是一个被称为“倾斜牙签综合症”的难以理解的混乱局面。使用一个不同的分隔符,比如
m{…}
,去掉后面的空格,然后我来读它;P我可以注意到,即使TLD也不必再是alpha了。@Schwern:更好?但它仍然只需要alpha TLD。但是我了解了m{},谢谢!缺少反攻。要使这样的正则表达式可读,请使用不同的分隔符,如
m{…}
。另外,避免使用$&因为它会减慢过程中的每个正则表达式的速度,因为无论您是否使用它,Perl都必须捕获并保持匹配(尽管惩罚不像以前那么严重)。使用捕获参数代替。非常好——简洁而全面。@Schwern,如果你发布解决方案,我将删除我的帖子。我从未掌握perl。听起来你知道的更多。不要删除它,你的解决方案基本上适合正则表达式。您已经将其构建为一个很好的包罗万象,以避免被非ASCII URL捕获。只需将其切换为使用捕获
m{(…您的正则表达式…}
然后使用$1而不是$&。难道没有一个CPAN模块可以做到这一点吗?