正则表达式链接

时间:2011-09-20 22:04:11

标签: php regex

我有一个带有'a'标签的文字。我必须添加一些新的标签和属性。

看起来像这样:

'Some test <a href="site">here</a>. Yet <a href="site2">another</a> test.'

现在我必须得到:

'Some test <noindex><a rel="nofollow" href="site">here</a></noindex>.'
'Yet <noindex><a rel="nofollow" href="site2">another</a></noindex> test.'

用php做任何快速的方法吗?感谢。

4 个答案:

答案 0 :(得分:2)

这样的事情将涵盖大多数现实世界的案例:

$text = 'Some test <a href="site">here</a>. Yet <a href="site2">another</a> test.';

$regex = '%(<a\s)(.*?</a>)%i';
$replacement = '<noindex>$1rel="nofollow" $2</noindex>';

preg_replace($regex, $replacement, $text);

答案 1 :(得分:1)

请记住,使用正则表达式进行HTML解析是一个坏主意(您应该使用DOMDocument之类的东西),这应该这样做:

$str = 'Some test <a href="site">here</a>. Yet <a href="site2">another</a> test.';
echo preg_replace('/<a(.+?)<\/a>/', '<noindex><a$1</a></noindex>', $str);
// Some test <noindex><a href="site">here</a></noindex>. Yet <noindex><a href="site2">another</a></noindex> test.

答案 2 :(得分:1)

只是想给DOMDocument(docs)版本,因为传统的智慧说“不要在HTML上使用RegEx !!”。嗯,这是一件好事,但那么什么!?好吧,你走了:

    // create a new DOMDocument
    $doc = new DOMDocument();

    // load the string into the DOM
    $doc->loadHTML('Some test <a href="site">here</a>. Yet <a href="site2">another</a> test.');

    // since we are working with HTML fragments here, remove <!DOCTYPE 
    $doc->removeChild($doc->firstChild);            

    // likewise remove <html><body></body></html> 
    $doc->replaceChild($doc->firstChild->firstChild->firstChild, $doc->firstChild);

    //Loop through each <a> tag in the dom and wrap it with <noindex>
    foreach($doc->getElementsByTagName('a') as $link) {
        $parent = $link->parentNode;
        $ni = $doc->createElement('noindex');
        $ni->appendChild($link->cloneNode(true));
        $parent->replaceChild($ni, $link);
    } 

   echo $doc->saveHTML();

请在此处查看:http://codepad.org/ANi93sBj

答案 3 :(得分:0)

$string = preg_replace('~<a.*?href=(.*?)>(.*?)</a>~msi', '<noindex><a rel="nofollow" href=$1>$2</a></noindex>', $html);