从PHP中的一段文本中提取链接,忽略图像链接

时间:2015-06-19 13:26:15

标签: php

我有这段文字,我想从中提取链接。一些链接有标签,有些链接就像那样,用普通格式。但我也有图像,我不想要他们的链接。

如何从这段文本中提取链接但忽略图像链接。所以基本上和google.com都应该提取。

string(441) "<p class="fr-tag">Please visit&nbsp;https://www.google.co.uk/?gfe_rd=cr&ei=9P2DVaW2BMWo8wfK74HYCg and this <a href="https://www.google.co.uk/?gfe_rd=cr&ei=9P2DVaW2BMWo8wfK74HYCg" rel="nofollow">link</a>&nbsp;should be filtered and this&nbsp;http://d.pr/i/1i2Xu&nbsp;<img class="fr-fin fr-tag" alt="Image title" src="https://cft-forum.s3-us-west-2.amazonaws.com/uploads%2F1434714755338-Screen+Shot+2015-06-19+at+12.52.28.png" width="300"></p>"

我尝试了以下但是不完整:

    $dom = new DOMDocument();
    $dom->loadHTML($html);

    $tags = $dom->getElementsByTagName('a');
    foreach ($tags as $tag) {
    $hrefs[] =  $tag->getAttribute('href'); 

3 个答案:

答案 0 :(得分:1)

我会尝试这样的事情。

查找和删除图片标记:

$content = preg_replace("/<img[^>]+\>/i", "(image) ", $content); 

查找并收集网址。

preg_match_all('#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#', $content, $match);

输出网址:

print_r($match);
祝你好运!

答案 1 :(得分:1)

只使用那一个字符串进行测试,以下内容适用于我:

$str =  '<p class="fr-tag">Please visit&nbsp;https://www.google.co.uk/?gfe_rd=cr&ei=9P2DVaW2BMWo8wfK74HYCg and this <a href="https://www.google.co.uk/?gfe_rd=cr&ei=9P2DVaW2BMWo8wfK74HYCg" rel="nofollow">link</a>&nbsp;should be filtered and this&nbsp;http://d.pr/i/1i2Xu&nbsp;<img class="fr-fin fr-tag" alt="Image title" src="https://cft-forum.s3-us-west-2.amazonaws.com/uploads%2F1434714755338-Screen+Shot+2015-06-19+at+12.52.28.png" width="300"></p>';

preg_match('~a href="(.*?)"~', $str, $strArr);

a href ="语句中使用" ... preg_match()会返回一个数组,$strArr包含两个值,这两个链接指向谷歌。

Array
(
    [0] => a href="https://www.google.co.uk/?gfe_rd=cr&ei=9P2DVaW2BMWo8wfK74HYCg"
    [1] => https://www.google.co.uk/?gfe_rd=cr&ei=9P2DVaW2BMWo8wfK74HYCg
)

答案 2 :(得分:-1)

我更多地玩这个并且有一个答案可能更适合你想要做的事情&#34;未来的证明&#34;

$str =  '<p class="fr-tag">Please visit&nbsp;www.google.co.uk/?gfe_rd=cr&ei=9P2DVaW2BMWo8wfK74HYCg and this <a href="https://www.google.co.uk/?gfe_rd=cr&ei=9P2DVaW2BMWo8wfK74HYCg" rel="nofollow">link</a>&nbsp;should be filtered and this&nbsp;http://d.pr/i/1i2Xu&nbsp;<img class="fr-fin fr-tag" alt="Image title" src="https://cft-forum.s3-us-west-2.amazonaws.com/uploads%2F1434714755338-Screen+Shot+2015-06-19+at+12.52.28.png" width="300"></p>';
$str = str_replace('&nbsp;',' ',$str);
$strArr = explode(' ',$str);
$len =  count($strArr);

for($i = 0; $i < $len; $i++){
    if(stristr($strArr[$i],'http') || stristr($strArr[$i],"www")){
        $matches[] = $strArr[$i];
    }
}

echo "<pre>";
print_r($matches);
echo "</pre>";

我回去分析了你的字符串并注意到如果你将&nbsp;翻译成空格,那么你可以explode将字符串放入一个数组中,逐步执行该操作,如果有任何元素包含{{1} }或http然后将它们添加到www数组中以便稍后处理。输出非常干净,易于使用,你也可以通过这种方式摆脱大部分的html标记。

需要注意的是,这可能不是最好的方法。我没有使用任何其他字符串进行测试,但是您提供的字符串是可以完成的。