正则表达式和PHP:在X个字符之后添加省略号

时间:2010-11-03 22:58:00

标签: php regex preg-replace

对于知道正则表达式的人来说应该相当简单。不幸的是,我不是那些知情人士。

如何在以下示例中将省略号附加到超过27个字符的任何内容,以便列出的第四个链接显示为http://iamanextremely.com/long/lin

<?php

$input = <<<EOF
http://www.example.com/
http://example.com
www.example.com
http://iamanextremely.com/long/link/so/I/will/be/trimmed/down/a/bit/so/i/dont/mess/up/text/wrapping.html
EOF;

$output = preg_replace("/(http:\/\/|(www\.))(([^\s<]{4,27})[^(\s|,)<]*)/",
'<a href="http://$2$3" rel="nofollow">http://$2$4</a>', $input);

3 个答案:

答案 0 :(得分:1)

除非你需要匹配特定的格式,即只有http://链接,否则正则表达式是过度的。只需使用字符串函数并循环遍历测试其长度的网址。如果您想获得幻想,请使用explode()array_walk()

if (strlen($url) > 27) {
  echo substr($url, 0, 27) . '...';
}
else {
  echo $url;
}

答案 1 :(得分:1)

您可以使用preg_replace_callback将回调应用于所有匹配的网址。在回调中,你可以根据自己的意愿制作精美的东西。

$output = preg_replace_callback('#(http://|www\\.)[^\\s<]+[^\\s<,.]#i',
                                'trimlong',$input);

function trimlong($match)
{
    $url = $match[0];
    $disp = $url;
    if ( strlen($disp) > 24 ) $disp = substr($disp,0,24)."...";
    return "<a href=\"$url\">$disp</a>";
}

(ps。我刚开始使用你的正则表达式,我不认为匹配的网址应该是那么麻烦。)

答案 2 :(得分:0)

如果要在HTML页面中显示,您可以考虑使用CSS来设置省略号,而不是手动截断它。

你会使用这样的CSS:

.cutshort {
    overflow: hidden;
    -o-text-overflow: ellipsis;
    text-overflow: ellipsis;
    white-space: nowrap;
    width:100%;
}

然后在屏幕上截断文本并给出省略号,即使HTML代码包含完整的字符串。

此技术并不适用于所有情况,但在其工作的地方,它是在将内容发送给用户之前对其进行黑客攻击的绝佳替代方法。

一个重要注意事项:当前版本的Firefox浏览器不显示省略号点。它确实仍然正确截断,所以这不是一场灾难。所有其他浏览器都显示点,并希望很快就会添加新版本的Firefox。