2009-09-17 24 views
0

我试图在我的内容中匹配<a>标记,然后替换为链接文本,然后用方括号中的网址替换为打印版本。如果只有“href”,以下示例工作。如果<a>包含另一个属性,则它匹配得太多并且不会返回所需的结果。我如何匹配URL和链接文本,就是这样?内容中的纯文本的固定标记

这里是我的代码:

<?php 
$content = '<a href="http://www.website.com">This is a text link</a>'; 
$result = preg_replace('/<a href="(http:\/\/[A-Za-z0-9\\.:\/]{1,})">([\\s\\S]*?)<\/a>/', 
    '<strong>\\2</strong> [\\1]', $content); 
echo $result; 
?> 

期望的结果:

<strong>This is a text link </strong> [http://www.website.com] 

感谢, 杰森

+0

你能用任何答案解决你的问题吗? – 2009-10-06 15:23:44

+0

谢谢你回来。是的,我能够使用“?”对于非常规的比赛来获得理想的结果。这适用于这种特殊情况。不过,我喜欢你解析DOM的方法。我需要充分理解这一点。 – JasonBartholme 2009-10-06 19:59:40

回答

1

您可以进行比赛ungreedy使用?。 您还应该考虑到href属性之前可能存在的属性。

$result = preg_replace('/<a [^>]*?href="(http:\/\/[A-Za-z0-9\\.:\/]+?)">([\\s\\S]*?)<\/a>/', 
    '<strong>\\2</strong> [\\1]', $content); 
8

您应该使用DOM来解析HTML,而不是正则表达式...

编辑:更新的代码做的href属性值简单的regex解析。

编辑#2:使循环回归,因此它可以处理多个替换。

$content = ' 
<p><a href="http://www.website.com">This is a text link</a></p> 
<a href="http://sitename.com/#foo">bah</a> 

<a href="#foo">I wont change</a> 

'; 


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

    $anchors = $dom->getElementsByTagName('a'); 
    $len = $anchors->length; 

    if ($len > 0) { 
     $i = $len-1; 
     while ($i > -1) { 
     $anchor = $anchors->item($i); 

     if ($anchor->hasAttribute('href')) { 
      $href = $anchor->getAttribute('href'); 
      $regex = '/^http/'; 

      if (!preg_match ($regex, $href)) { 
      $i--; 
      continue; 
      } 

      $text = $anchor->nodeValue; 
      $textNode = $dom->createTextNode($text); 

      $strong = $dom->createElement('strong'); 
      $strong->appendChild($textNode); 

      $anchor->parentNode->replaceChild($strong, $anchor); 
     } 
     $i--; 
     } 
    } 

    echo $dom->saveHTML(); 
    ?> 
+0

裸露在我身边,试图重新格式化它:p – 2009-09-17 16:39:24

+0

终于 - 我们走了。 – 2009-09-17 16:40:10

+0

谢谢你的努力。我需要更多地深入DOM操作。 – JasonBartholme 2009-09-17 18:44:18