用正则表达式替换文本中的所有链接

时间:2013-06-19 17:13:38

标签: php regex

我想替换文本中的所有链接除了图像链接

$text = '<p>
<a href="http://msn.com" rel="attachment wp-att-7046"><img class="alignnone size-full wp-image-7046" alt="geak-eye-mars" src="http://google/2013/06/geak-eye-mars.jpg" width="619" height="414" /></a></p>
bla bla bla bla bla bla
<p><a href="http://google.com" target="_blank">any word</a>
bla bla bla bla bla bla
</p>';

我想要替换(http://msn.com and http://google.com)和其他链接,但像这样的图像链接(http://google/2013/06/geak-eye-mars.jpg)保持原样。 我希望你理解我..我只想替换这个标签之间的所有链接

href="Link"

通过此代码

$text = ereg_replace("all links","another link">",$text);

谢谢

3 个答案:

答案 0 :(得分:4)

使用DOM执行此操作:

$text = <<<LOD
<p><a href="http://msn.com" rel="attachment wp-att-7046">
<img  src="http://google/2013/06/geak-eye-mars.jpg" /></a></p>
  bla bla bla bla bla bla
<p><a href="http://google.com" target="_blank">any word</a>
bla bla bla bla bla bla
</p>
LOD;

$doc = new DOMDocument();
@$doc->loadHTML($text);
$aNodes = $doc->getElementsByTagName("a");

foreach($aNodes as $aNode) {
    $href = $aNode->getAttribute("href");
    $new_href = '!!!Youhou!!! '. $href;
    $aNode->setAttribute("href", $new_href);
}

$new_text = $doc->saveHTML();

答案 1 :(得分:0)

如果您想要一个不会破坏的永久解决方案,请使用DOM解析器,就像其他答案所示。使用正则表达式解析html是一个非常糟糕的主意。

但是,如果你只是想要一次性的快速解决方案,那么这样的事情就可以了:

preg_replace('/(href=["\']?)[^"\']+/', '$1' . $newtext, $html);

保证,这会在某些html文件上失败(例如,如果URL没有包含在引号中),但只要编写html文件的人使用了最佳实践,它就能使用。不要在生产代码中使用它。如初。

答案 2 :(得分:0)

$text = <<<LOD
<p><a href="http://msn.com" rel="attachment wp-att-7046">
<img  src="http://google/2013/06/geak-eye-mars.jpg" /></a></p>
  bla bla bla bla bla bla
<p><a href="http://google.com" target="_blank">any word</a>
bla bla bla bla bla bla
</p>
LOD;

$doc = new DOMDocument();
$text = mb_convert_encoding($text, 'HTML-ENTITIES', "UTF-8");
@$doc->loadHTML($text);
$aNodes = $doc->getElementsByTagName("a");

foreach($aNodes as $aNode) {
    $href = $aNode->getAttribute("href");
    $new_href = '!!!Youhou!!! '. $href;
    $aNode->setAttribute("href", $new_href);
}

$new_text = $doc->saveHTML();