PHP截断preg_replace URL

时间:2018-02-06 20:33:54

标签: php regex preg-replace truncate

需要一些建议来实现以下方法: 我当前的脚本获取文本,如果它有URL,则替换它们。问题是我想截断URL,因此它们不会破坏表格的宽度或难以看到的换行符以适应它们。

$text = file_get_contents("temp.txt");
$link = preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)?)@', '<a href="$1" target="_blank">$1</a>', $text);
echo $link;

我担心如果我substr() $link,那么如果找到多个网址,它就无法工作。您可以在替换中使用PHP $1吗?任何替代方案?

2 个答案:

答案 0 :(得分:0)

使用preg_replace_callback修改匹配和替换。这将返回前10个字符作为示例:

$link = preg_replace_callback('@(https?://([-\w\.]+)+(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)?)@',
             function($m) {
                 return '<a href="'.$m[1].'" target="_blank">'.substr($m[1], 0, 10).'</a>';
             },
             $text);

答案 1 :(得分:0)

这种问题也可以在客户端使用css解决(我假设你在谈论你的问题中的html元素table)。

为此,您必须为单元格指定固定大小,并将display属性设置为inline-block。然后,您可以使用white-spaceoverflowtext-overflow属性定义单词过长时单元格的行为。

示例:

<html>
    <head>
        <style>
.mytable td:nth-child(2) {
    display: inline-block;
    width: 200px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
        </style>
    </head>
    <body>
        <table class="mytable">
            <tr><td>abcd</td><td>www.smallurl.jp</td><td>efgh</td></tr>
            <tr><td>ijkl</td><td>www.a-giant.url/larger/than/the/cell/width</td><td>mnop</td></tr>
        </table>
    </body>
</html>