【问题标题】:Find position of console escape code in string在字符串中查找控制台转义码的位置
【发布时间】:2016-07-15 20:38:01
【问题描述】:

tl;dr 如何在 PHP 中编写 strpos($haystack, '^[[H^[[2J')

一个 linux 命令行应用程序会提供一个满屏数据,然后是控制台转义码,以在常规循环中将光标返回到“home”位置。为了访问数据,我将输出通过管道传输到我自己的脚本,如下所示:

$ ./otherapp | php myscript.php

这是一个连续的数据流,所以我使用this example for non-blocking stream consumption

现在要解码输出,我需要抓取一个完整的帧/屏幕的数据。转义码在 nano 中显示为^[[H^[[2J。最简单的方法似乎是检测这些转义码并使用它们之间的输出。

转义码在 PHP 字符串中是如何表示的?我可以使用strpos(或等效的mbstring)来检测他们的位置吗?

【问题讨论】:

  • ^[ 是终端控制序列。它不是文字^,后跟文字[,等等......它是一个字符,其视觉表示是两个字符^[。这是ASCII字符(27)。
  • “PHP 字符串中的转义码是如何表示的?” - 使用 urlencode 之类的东西作为查看包含在这样位置的数据。然后使用 \x 或 \u syntax for double-quoted string literals 创建一个包含等价字符的字符串,并使用它来搜索&替换或拆分。

标签: php


【解决方案1】:

看来您是在 Unix 环境中。为了实现你的转义码,你可以试试echo -en "\033[H"echo -en "\033[2J",所以我想你应该试试strpos('\033[H\033[2J', $haystack)这样的东西。

也许您需要添加一个额外的反斜杠 ('\\\033[H\\\033{2J')。

由于\033 表示“八进制值为 33 的字节”,即 ESC,因此应该可以:

strpos("\e[H\e[2J", $haystack)

如果您希望 PHP 解释特殊字符的转义序列,则需要用双引号 (") 将其括起来。

【讨论】:

  • 谢谢!使用双引号 \e 效果很好,CBroe 在 cmets 中暗示的 \x1b 也是如此。我无法使用八进制表示法,但我没有太努力:)
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多