Chinaunix

标题: 请教匹配图片地址的正则 [打印本页]

作者: 昭襄王    时间: 2010-10-05 09:38
标题: 请教匹配图片地址的正则
<a href="/"><img src="images/default/logo.gif" alt="ChinaUnix.net" border="0"></a>

以这个为例,只要匹配images/default/logo.gif,<img />内部各个元素数量不等,位置不定,外部语境不定。引号有可能是双引号或单引号。src中有可能是“http://xxxx/xxx”或“/xxxx/xxx”或“xxxx/xxx”。图片格式不可知。
只需要正则
作者: rdcwayx    时间: 2010-10-05 09:52
本帖最后由 rdcwayx 于 2010-10-05 09:53 编辑

不全用正则。后面的继续。
  1. awk 'BEGIN{RS="<"}/img src/{print gensub(/^.....(.+).$/,"\\1","g",$2)}' infile
复制代码

作者: 昭襄王    时间: 2010-10-05 09:58
不全用正则。后面的继续。
rdcwayx 发表于 2010-10-05 09:52



    是这样,我这个需求是用在php里面的preg_match()函数,用正则是最简练的办法。
如果用别的办法也可以,最差我可以把文本中所有src冒泡筛出来,但那样太罗嗦。需要判断的东西也太多。
恳求犀利正则!
作者: 昭襄王    时间: 2010-10-05 10:00
是这样,我这个需求是用在php里面的preg_match()函数,用正则是最简练的办法。
如果用别的办法也 ...
昭襄王 发表于 2010-10-05 09:58



    另外,img和src不一定紧挨着,之间可能是alt等等。元素位置不固定。
作者: 昭襄王    时间: 2010-10-05 11:24
还在放假吗?
作者: dibug    时间: 2010-10-05 11:31
会的都在放假,不会的都在灌睡
作者: 昭襄王    时间: 2010-10-05 12:47

会的赶快上班吧
作者: 昭襄王    时间: 2010-10-06 11:22
顶一下
作者: 昭襄王    时间: 2010-10-07 08:42

作者: ly5066113    时间: 2010-10-07 09:55
  1. 内部各个元素数量不等,位置不定,外部语境不定。引号有可能是双引号或单引号。src中有可能是“http://xxxx/xxx”或“/xxxx/xxx”或“xxxx/xxx”。图片格式不可知
复制代码
什么都不确定,怎么写?
有什么是确定的?
况且又要求是PHP的正则,各种工具之间的正则表达式都有差别。
作者: 昭襄王    时间: 2010-10-07 10:54
什么都不确定,怎么写?
有什么是确定的?
况且又要求是PHP的正则,各种工具之间的正则表达式都有差别。
ly5066113 发表于 2010-10-07 09:55



    确定的是<img >中肯定有src="xxx",php的正则支持posix和pcre(Perl-Compatible Regular Expressions) 两种风格。
例如下面的函数用到的正则是perl兼容的。
找到$str中所有<img alt="xxx" src="xxx" whtaever="xxx">标签,作为数组元素写入数组$match
  1. preg_match_all('/<img\s[^>]*>/',$str,$match);
复制代码
现在我想知道怎么写正则直接获得img里面的src部分(只要""里面的xxx)
作者: ly5066113    时间: 2010-10-07 11:25
  1. ly5066113@ubuntu:~$ cat test.pl
  2. #! /usr/bin/perl

  3. my $str = q(<img alt="xxx" src="xxx.jpg" whtaever="xxx">);
  4. print "$2\n" if $str =~ /<img\s[^>]*src=(["'])([^"']+)$1/;
  5. ly5066113@ubuntu:~$ ./test.pl
  6. xxx.jpg
复制代码

作者: 昭襄王    时间: 2010-10-07 12:05
回复 12# ly5066113


    多谢!
小小改了一下,适应php,可以工作。
  1. $reg = "/<img\s[^>]*src=([\"\'])([^\"\']+)/";
  2. preg_match_all ($reg,$lines,$match);
  3. print_r($match[2]);
复制代码
$match[0]和$match[1]是别的东西。还能修正吗?
Array
(
    [0] => Array
        (
            [0] => <img border="0" title="简评" alt="简评作" src="http://images2.china.com/65421900.jpg
            [1] => <img border="0" title="简评" alt="简评作" src="http://images2.china.com/65421901.jpg
            [2] => <img border="0" title="简评" alt="简评作" src="http://images2.china.com/65421900.jpg
            [3] => <img border="0" title="简评" alt="简评作" src="/china.com/65421901.jpg
        )

    [1] => Array
        (
            [0] => "
            [1] => "
            [2] => "
            [3] => "
        )

    [2] => Array
        (
            [0] =>
            [1] =>
            [2] =>
            [3] => /china.com/65421901.jpg
        )

)
作者: ly5066113    时间: 2010-10-07 13:18
回复 13# 昭襄王


没看懂什么意思。
作者: 昭襄王    时间: 2010-10-07 13:45
回复 14# ly5066113


    这个函数返回的$match是一个二维数组,完美匹配的情况下应该这样:
print_r($match);
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [0] => http://images2.china.com/65421900.jpg
  6.             [1] => http://images2.china.com/65421901.jpg
  7.             [2] => http://images2.china.com/65421900.jpg
  8.             [3] => /china.com/65421901.jpg
  9.         )

  10. )
复制代码
现在,出现了
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [0] => <img border="0" title="简评" alt="简评作" src="http://images2.china.com/65421900.jpg
  6.             [1] => <img border="0" title="简评" alt="简评作" src="http://images2.china.com/65421901.jpg
  7.             [2] => <img border="0" title="简评" alt="简评作" src="http://images2.china.com/65421900.jpg
  8.             [3] => <img border="0" title="简评" alt="简评作" src="/china.com/65421901.jpg
  9.         )

  10.     [1] => Array
  11.         (
  12.             [0] => "
  13.             [1] => "
  14.             [2] => "
  15.             [3] => "
  16.         )

  17.     [2] => Array
  18.         (
  19.             [0] => http://images2.china.com/65421900.jpg
  20.             [1] => http://images2.china.com/65421901.jpg
  21.             [2] => http://images2.china.com/65421900.jpg
  22.             [3] => /china.com/65421901.jpg
  23.         )

  24. )
复制代码
使用的时候区别不大,但是有不该出现的东西。
作者: ly5066113    时间: 2010-10-07 13:54
回复 15# 昭襄王

看起来:
0 是匹配的整个字符串
1 是第一个括号里的内容
2 是第二个括号里的内容

这样试试:

$reg = /(?:<img\s[^>]*src=["'])[^"']+/
作者: 昭襄王    时间: 2010-10-07 14:21
回复 16# ly5066113

不行。直接空值了。
    刚才看了一下文档,看到老外的正则末尾有"is",试了一下,成功了。只输出了一个一维数组。但我不知道为什么。还是得RTFM啊
再次感谢Tim
  1. $reg = "/<img\s[^>]*src=([\"\'])([^\"\']+)/is";
  2. preg_match_all ($reg,$lines,$match);
  3. print_r($match[2]);
复制代码
  1. Array
  2. (
  3.     [0] => http://images2.china.com/65421900.jpg
  4.     [1] => http://images2.china.com/65421901.jpg
  5.     [2] => http://images2.china.com/65421900.jpg
  6.     [3] => /china.com/65421901.jpg
  7. )
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2