仅使用正则表达式拉出一个链接

only pulling one link out using regular expressions

提问人:Epiphanisation 提问时间:1/26/2011 最后编辑:Dan GrossmanEpiphanisation 更新时间:1/27/2011 访问量:173

问:

嗨,我有以下代码,我只想拉出具有 www.在他们身上

<p> Text < href="http://url.com/link/">link text</a> more text < href="http://www.anotehrurl.com/">more link text</a> and < href="http://www.anotherurl.com/sub/sub/link.html">link text</a>. more text < href="http://keepurl.co.uk/link/">link text</a> more text < href="http://www.anotherurl.com/sub/sub/link.html">link text</a>. < href="http://www.anotherurl.com/sub/sub/link.html">link text</a>.  < href="http://www.anotehrurl.com/">more link text</a></p>

im 使用 reg 表达式:

(<a href="http:\/\/www.[\d\D]*?\/">([\d\D]*?)<\/a>)

基本上我想匹配任何以 www 开头的链接,而不是匹配任何 keepurl.co.uk/ 链接......

我已经把它通过rubular拿出来了:

{ 结果 1

1.< href=“http://www.anotehrurl.com/”>更多链接文本 2.更多链接文字 结果 2

1.< href=“http://www.anotherurl.com/sub/sub/link.html”>链接文本。更多文本 < href=“http://keepurl.co.uk/link/”>链接文本 2.link 文本 结果 3

1.< href=“http://www.anotherurl.com/sub/sub/link.html”>链接文本。< href=“http://www.anotherurl.com/sub/sub/link.html”>链接文本。< href=“http://www.anotehrurl.com/”>更多链接文本 2.更多链接文字 }

正如你所看到的,它拉出的比我想要的要多。

干杯

PHP 正则表达式

评论

0赞 Epiphanisation 1/26/2011
如何让所有代码正确显示
0赞 Epiphanisation 1/26/2011
在我之前的问题中,一定有人做了一些事情,因为所有的 HTML 和 PHP 都是可见的
0赞 deceze 1/26/2011
将您的代码缩进 4 个空格,或选择它并按下工具栏中的按钮!{}
0赞 Marcin 1/26/2011
你是解析整个html页面,还是只解析一些片段?也许您应该考虑使用 DOMDocument 或任何其他用于 php 的 html 解析器?
0赞 Epiphanisation 1/26/2011
只是剪裁,我知道可能有更好的方法可以做到这一点,但是在mo,我的代码已接近完成,我还没有重写的生命意志力!

答:

0赞 dqhendricks 1/26/2011 #1
/<a.+?href="([http:\/\/]?www\..+?)".+?>/i

类似的东西。

0赞 mhitza 1/26/2011 #2

假设您已将文本保存在变量中,这应该适合您。$string

preg_match('@href="(http://www\.(?!keepurl.co.uk).*?)"@i', $string, $m);

在哪里:($!regex)

零宽度负前瞻。与正前瞻相同,只是只有当前瞻中的正则表达式不匹配时,整体匹配才会成功。

一个很好的正则表达式参考页面

1赞 Marcin 1/26/2011 #3

这个呢:

       <?php
        $html = <<<END
   <p> Text < href="http://url.com/link/">link text</a> more text
       < href="http://www.anotehrurl.com/">more link text</a>
       and < href="http://www.anotherurl.com/sub/sub/link.html">link text</a>.
       more text < href="http://keepurl.co.uk/link/">link text</a> more text
       < href="http://www.anotherurl.com/sub/sub/link.html">link text</a>.
       < href="http://www.anotherurl.com/sub/sub/link.html">link text</a>.
       < href="http://www.anotehrurl.com/">more link text</a></p>
END;


        $r = '#href=\"http://(www\.[^\"]*)\">(.+)</#iU';

        preg_match_all($r, $html, $m);

        var_dump($m[1]);
        var_dump($m[2]);
        ?>

输出:

array
  0 => string 'www.anotehrurl.com/' (length=19)
  1 => string 'www.anotherurl.com/sub/sub/link.html' (length=36)
  2 => string 'www.anotherurl.com/sub/sub/link.html' (length=36)
  3 => string 'www.anotherurl.com/sub/sub/link.html' (length=36)
  4 => string 'www.anotehrurl.com/' (length=19)
array
  0 => string 'more link text' (length=14)
  1 => string 'link text' (length=9)
  2 => string 'link text' (length=9)
  3 => string 'link text' (length=9)
  4 => string 'more link text' (length=14)

评论

0赞 Epiphanisation 1/29/2011
不太确定为什么当我尝试您的确切版本时,我无法让它工作,但我使用了您的部分答案和我现有的代码,现在它可以工作了,谢谢 marcin :)
0赞 Epiphanisation 1/29/2011
这是我最后使用的 /(<a href=“http:///\/www\.[^\“]*”>([\d\D]*?)<\/a>)/