PHP 截断 preg_replace URL

PHP truncate preg_replace URL

需要一些方法建议来实现以下目标: 我当前的脚本获取文本,如果它有 URL(s) 则它会替换它们。问题是我想截断 URLS(s),这样它们就不会打破 table 的宽度或难看的换行符以适合它们。

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

我担心如果我 substr() $link 然后如果找到多个 URL 则它不会工作。你能把PHP中的替换掉吗?还有其他选择吗?

使用preg_replace_callback修改匹配和替换。这returns前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);

此类问题也可以在客户端使用 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>