【问题标题】:How to split up a string after a certain number of characters in PHP如何在PHP中的一定数量的字符后拆分字符串
【发布时间】:2012-08-04 16:41:52
【问题描述】:

我正在使用 PHP 返回用户的浏览器用户代理问题是我想在哪里打印它:我不希望长度超过每行大约 30 个字符。有没有办法将返回的变量(从我调用以获取字符串的函数)分解为一定长度的子字符串?而且由于 UA 字符串的长度不同,我不确定会发生什么。

这是我返回用户代理的 PHP 代码:

function __toString() {
    return "Browser Name:
    return "Browser Name:             {$this->getBrowser()}  \n" .
           "    Browser Version:          {$this->getVersion()} \n" .
             "  Browser User Agent String:           {$this->getUserAgent()} \n" .
           "    Platform:                 {$this->getPlatform()} ";
}

特别是这个电话$this->getUserAgent。我使用这个输出:

<?php require_once('browser.php'); $browser =  new Browser(); echo $browser . "\n"; ?>

现在,名称、版本和平台调用输出如我所愿(因为在 UA 字符串中没有任何一个接近)。

简而言之,我如何拆分返回的用户字符串,使其每行不超过一定数量的字符?理想情况下,我想将它们存储到临时变量中,因为我必须在单词之间添加空格。比如“Platform”,前面有空格,所以和Browser Version垂直对齐,然后空格,让函数返回的所有字符串的结果对齐。

如果有人想要上面的 Github 代码来看看我在做什么,函数调用在第 339-243 行的this,回显结果转到第 152 行的this

此时我已经很接近了

只需要帮助在包装文本前添加空格(请参阅下面的答案)

这就是我现在拥有的:

$text1   = $this->getUserAgent();
$UAline1 = substr($text1, 0, 26);

$text2       = $this->getUserAgent();
$towrapUA    = str_replace($UAline1, '', $text2);
$wordwrapped = chunk_split($towrapUA, 26, "\n\r");

此时唯一的问题是如何在每个包装代码之前获得恒定数量的空格?我需要(比方说)在所有换行之前留出 20 个空格来进行格式化。

【问题讨论】:

  • 您要查找的函数名为wordwrap
  • @hakre 但我不想截断它。我想保留整个字符串,只是在返回时对其进行格式化。
  • @hakre wordwrap 看起来很有希望。
  • 自动换行功能不会截断它。如果建议的副本不能满足您的特定需求,我很抱歉没有选择正确的,但我敢打赌,至少在这个网站上有很多重复的问题。

标签: php string


【解决方案1】:

试试这个:

$str = chunk_split($string, 30, "\n\r");
// Splits a string after X chars (in this case 30) and adds a line break

你也可以用正则表达式试试:

$str = preg_replace("/(.{30})/", "$1\n\r", $string);

或者,正如上面的 cmets 所建议的,这也是同样的事情:

$str = wordwrap($string, 30, "<br />\n");

更多信息:

http://php.net/manual/en/function.chunk-split.php

http://us2.php.net/wordwrap

编辑:

根据您编辑的问题,看起来这就是您要查找的内容:

$text1    = $this->getUserAgent();
$UAline1  = substr($text1, 0, 26);
$towrapUA = str_replace($UAline1, '', $text1);

$space = str_repeat('&nbsp;', 20);

$wordwrapped = wordwrap($towrapUA, 26, "\n");
$wordwrapped = explode("\n", $wordwrapped); // Split at '\n'

$numlines = count($wordwrapped) - 1;
$string   = '';
$i = 0;

foreach($wordwrapped as $line) {
    if($i < $numlines) {
        $string .= $space . $line . "\n\r"; // Add \n\r back in if not last line
    } else {
        $string .= $space . $line; // If it's the last line, leave off \n\r
    }

    $i++;
}

echo $string;

【讨论】:

  • 我发现实际上非常接近我想要做的事情,此时我唯一的问题是格式。你能看看我在下面发布的答案吗?
  • 但是如何在 wordwrap 的返回前加上空格(下面的答案)?
  • @ChrisMirno 根据您提供的新信息更新了我的答案。
  • @ChrisMirno 刚刚记得你想在换行之前添加空格,并在几秒钟内更新......
  • 我想我编辑了你的编辑。让我快速更新它。我在看你的和它的完美,但唯一的是我需要在包裹部分的行之前有一个恒定数量的空格。此外,我想我想在 wordwrap() 上使用 chunk_split,因为 UA 每次都应该精确地分割为 26 个字符。
猜你喜欢
  • 2012-06-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多