【问题标题】:PHP: Telegram Bot: Insert line break to text messagePHP:电报机器人:在短信中插入换行符
【发布时间】:2015-11-01 17:11:36
【问题描述】:

"\n""\r\n",在电报机器人发送的短信中进行测试,以创建换行符。使用后将出现下划线_,而不是显示换行符。

如何在机器人发送的电报消息中打印换行符?

代码

$txt = 'با تشکر از عضویت شما، هر روز حدود ساعت 10 شب یک ویدئوی جالب برای شما ارسال خواهد شد.';
$txt .= " \n ";
$txt .= 'Thanks for joining, Every day at almost 18:30 GMT an intersting video will be sent';

消息演示

任何帮助将不胜感激。

【问题讨论】:

  • @Dagon 非常感谢,第一个只是复制消息并打印两次,但第二个完成这项工作。请问这些代码的来源在哪里?
  • 谷歌对我的第一次点击是:twilio.com/help/faq/sms/…
  • 一个简单的\n 应该可以工作,您使用的机器人管理器可能会在发送消息之前进行一些清理。我正在使用 nodejs,\n 工作得很好。

标签: php telegram-bot linefeed


【解决方案1】:

还有更好的方法!问题是由于 URL 编码... 您可以使用\n 使用普通的 PHP 文本,但通过将其传递给 urlencode 方法,如下所示:

$txt = urlencode("here is my text.\n and this is a new line \n another new line");

它对我有用!

【讨论】:

  • 对不起 Majid,现在我测试另一个答案,所有选项都失败了,所以我取消选中他的答案并检查你的
  • urlencode 对我不起作用(它对所有内容进行编码,包括空格)。如果您像我一样习惯使用单引号, \n 必须用双引号: $text = 'my text' 。 "\n";
【解决方案2】:

1) 如果您在 Windows/Linux 操作系统中开发代码,您可以简单地使用 enter in text:

$text = 'test 123
         another text';

就是这样!

2) 如果您的代码在 Windows/Linux 服务器上运行,您可以使用 PHP_EOL 常量而不是 \n

$text = 'text 123 '.PHP_EOL.'yet another text';

3) 如果您搜索独立于操作系统的解决方案,您可以为此目的使用%0Achr(10)

$text = 'text 123 '.chr(10).'yet another text';

【讨论】:

  • @Majid 因为你在 Mac 上!在 iOS 中,PHP_EOL 和换行符等于%0D(或\r)。但在 linux 和 windows 中,PHP_EOL 和换行符等于%0A(或\n)和%0D%0A(或\r\n)。
  • @Majid 我为你添加第三种方式:)
  • 感谢您考虑这个问题。我在 Mac 上,但运行 PHP 代码的服务器是 Internet 上的 linux 服务器!无论如何感谢您添加第三种方式:-)
【解决方案3】:

对于未来的访客,我只是在 cmets 中引用@Dagon 的答案:

使用%0A 将在电报消息中换行

【讨论】:

  • 这应该是公认的答案。 urlencode 函数与语言无关。在任何环境或语言中使用电报 API 时,您的解决方案都有效。
【解决方案4】:

在波斯语等 Unicode 语言中,它可能无法显示您想要的结果! 您可以准备文本并使用它:

$txt = implode("\n", explode('\n', $txt));

【讨论】:

    【解决方案5】:

    为了避免编码和编码问题,我在我的代码中使用了这个简单的解决方案:

    • 首先,我通过在“sendMessage” URL 中设置 parse_mode=HTML 参数以 HTML 格式发送我的文本消息。
    • 然后,我在每个换行符处插入以下代码:

      <pre>\n</pre>

    即。

    ... sendMessage?parse_mode=HTML&text="... paragraph1<pre>\n</pre>paragraph2 ..."
    

    当然 text 变量在附加到 URL 之前已被 curl 转义:

    $text = curl_escape($handle, $text);
    

    【讨论】:

      【解决方案6】:

      在阅读并尝试了所有这些答案之后,我只想发布自己的解决方案。我在 Laravel 5.8 中有一个应用程序,它通过电子邮件和电报消息发送预订。

      $telegramMessage = 
              "<strong>Reservation Request</strong>\n".
               '<strong>Name:</strong> ' . $reservation->reserv_name . "\n".
               '<strong>E-mail:</strong> <a href="mailto:' . $reservation->email . '"> ' . $reservation->email . "</a>\n".
               '<strong>Phone:</strong> ' . $reservation->phone . "\n".
               '<strong>Reservation Date/Time:</strong> ' . $reservation->reserv_date_time->format('d-m-Y H:i') . "\n".
               '<strong>Number of people:</strong> ' . $reservation->number_of_people . "\n".
               '<strong>Message:</strong> ' . $reservation->reserv_message . "\n";
      
      Telegram::sendMessage([
                  'chat_id' => env('TELEGRAM_CHAT_ID', ''),
                  'parse_mode' => 'HTML',
                  'text' => $telegramMessage,
              ]);
      

      我或多或少使用了 Telegram API 允许的所有 html 标签。请注意 \n 必须用双引号括起来。

      【讨论】:

        【解决方案7】:

        您可以使用 %0A 代替 \n。

        【讨论】:

          【解决方案8】:

          所有这些答案同时是“正确”和“错误”。事实上,这取决于你的很多输入。例如,如果您有一个文本区域供输入,然后将内容发送到 Telegram,如果用户在文本区域中写入并按回车,则 Telegram 中的文本将是

                 hello\neverybody 
          

          而不是

                 hello
                 everybody
          

          执行 URL 编码不会有任何改变。经过一番挣扎后,我发现将文本区域数据从一个页面发送到另一个页面会转义一些数据这一事实存在冲突。

          我解决这个问题的方法是将转义的 \n 替换为非转义的。 所以:

                $my_msg = str_replace("\\n","\n",$my_msg);
          

          它适用于 Mac、PC 等,带有来自文本区域的文本。

          【讨论】:

            【解决方案9】:

            我是这样解决问题的:

            $txt = 'aaaaaaaaa\nnew line1 \nnewline2';
            $parameters = array('chat_id' => $chatId, "text" => $txt);
            
            $parameters["method"] = "sendMessage";
            echo json_encode($parameters);
            

            在这里试试:https://telegram-bot-sdk.readme.io/docs/sendmessage

            【讨论】:

              【解决方案10】:

              你应该使用 urlencode 来解决这个问题:

              $text ="sth sth
              sth sth";
              $text = urlencode($text);
              

              【讨论】:

                【解决方案11】:

                对我来说,这个解决方案有效: 使用双引号

                $message='Hi'
                $message=$message."\n";
                $message=$message.'Guys'
                

                【讨论】:

                  【解决方案12】:

                  试试这样的东西,它对我有用,你需要添加参数 parse_mode。

                  $text = "exampletest \n example"
                  

                  或类似的东西:

                  $text1 = 'example';
                  $text2 = 'next';
                  $data = $text1 . "\n" . $text2;
                  

                  https://core.telegram.org/bots/api#formatting-options

                  【讨论】:

                    【解决方案13】:

                    很容易从任何地方复制断行来传递代码。 enter image description here

                    【讨论】:

                    • 欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案添加解释并说明适用的限制和假设。
                    猜你喜欢
                    • 1970-01-01
                    • 2017-08-18
                    • 1970-01-01
                    • 2019-03-14
                    • 2022-06-14
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-10-05
                    相关资源
                    最近更新 更多