PHP:如何将字符串插入匹配的正则表达式模式(将rel =“no-follow”添加到锚点链接)

时间:2011-11-27 13:43:52

标签: php regex

我正在使用PHP为我的网站编写评论系统。

我想做以下事情:

  1. 在评论中检测所有外部链接(即源名称不包含字符串mywebsite.com的锚标记)
  2. 将字符串'rel =“no-follow”'添加到上面步骤1中标识的锚标签。
  3. 我对这样的功能有一个想法,但我需要一些经验丰富的PHP开发人员的帮助,以便我确信我正在以正确的方式做事。这是我的第一次尝试

    <?php
    
    function process_comment($comment)
    {
    
        $external_url_pattern = "href=[^mywebsite.com]"; //this regex is probably wrong (Help!)
    
        //are there any matches
        $matches = array();
        preg_match_all($external_url_pattern, $comment, $matches);
    
        foreach($matches as $match)
        {
           // how do we insert the 'rel="no-follow" string ?
        }
    
    }
    
    
    ?>
    

    非常感谢帮助我完成此功能的任何评论,指示和提示。感谢。

2 个答案:

答案 0 :(得分:0)

不知道这是否合适,但您也可以使用DOMDocument代替正则表达式:

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

//Evaluate Anchor tag in HTML
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");

for ($i = 0; $i length; $i++) {
        $href = $hrefs->item($i);
        $url = $href->getAttribute('href');

        if($url == "mywebsite.com") {        
             $href->setAttribute("rel", "no-follow");
        }
}

// save html
$html=$dom->saveHTML();

echo $html;

希望有所帮助

答案 1 :(得分:0)

这有点棘手但会完成这项工作。

function process_comment($str)
{

    //parses href attribute values into $match
    if(preg_match_all('/href\=\"(.*)\"/',$str,$match))
    {
        foreach($match[1] as $v)
        {
            //check matched value contains your site as host name
            //if not 
            //adds rel="no-follow" and replaces the link with the attribute
            if(!preg_match('@^(?:http://)?(w+\.)?'.$mysite.'(.*)?@i',$v, $m))
            {
                $rel = $v.'" rel="no-follow';
                $str = str_replace($v,$rel,$str);
            }   
        }
    }

    return $str;
}

process_comment($comment);

您只需使用strstr代替第二preg_match即可。我使用它是因为我认为某些网址可能包含类似"http://www.external.com/url.php?v=www.mysite.com"

的内容