如何使用php查找和删除字符串中的最后一个链接标记?

时间:2012-01-26 23:46:12

标签: php html regex

我有一个这样的字符串,但每种情况下链接的数量可能不同:

<a>link 1</a> >> <a>link 2</a> >> <a>link 3</a> >> <a>link 4</a>    

我想删除该字符串中的最后一个链接,然后像这样转换:

<a>link 1</a> >> <a>link 2</a> >> <a>link 3</a> >> link 4    

有一个简单的功能吗?我知道我可以使用preg_match,preg_match_all,explode等几个函数...使用这些函数,删除第一个链接标记很容易,但删除最后一个标签有点令人困惑。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

使用DOM解析器,例如DOMDocument

$html = '<p> 
<a>link 1</a> >> <a>link 2</a> >> <a>link 3</a> >> <a>link 4</a>    
</p>';

$dom = new DOMDocument;

$dom->loadHTML($html);

$a = $dom->getElementsByTagName('a');

$lastA = $a->item($a->length - 1);

$dom->getElementsByTagName('p')->item(0)->appendChild($dom->createTextNode($lastA->nodeValue));

$lastA->parentNode->removeChild($lastA);

$newHtml = '';

foreach ($dom->getElementsByTagName('body')->item(0)->childNodes as $node) {
    $newHtml .= $dom->saveHTML($node);
}

echo $newHtml;

CodePad

此代码输出......

<p> 
<a>link 1</a> &gt;&gt; <a>link 2</a> &gt;&gt; <a>link 3</a> &gt;&gt;     
link 4</p>

当然,您不应该在HTML中使用>(它应该编码为&gt;)。但如果必须,请在最终的HTML上使用html_entity_decode()

CodePad

答案 1 :(得分:1)

至于regexp ......

$str = '<p> 
<a>link 1</a> >> <a>link 2</a> >> <a>link 3</a> >> <a>link 4</a>    
</p>';
echo preg_replace('#^(.*)<a[^>]*?>(.*?)</a>(.*?)#im', '$1$2$3', $str);