2

Using PHP to call a Java app, the Java app returns a string encapsulated by "[....]", I need to remove the outside brackets and maintain what's inside -a mix of integers, strings, and other special chars like (, etc.. I'm using sscanf successfully later in the process, so I'm a little lost as to why this particular step is so difficult.

Input:

 $str = [(123)[334.5 : 765.1] string]

Non-functional code:

$format = '[%s]';
sscanf($str,$format,$output);

Later in the process I'm successfully using sscanf to parse the inside string using:

$format = '(%d) [%f : %f] %s';

I'm missing something big here...

4

3 回答 3

4

假设字符串总是包裹在 [...] 中并且您不需要检查格式不正确的字符串,您可以简单地删除第一个和最后一个字符:

$str = substr($str, 1, -1);

编辑:这比使用 trim() 和朋友更可靠,因为 ltrim/rtrim 将删除所有前导/尾随方括号,而不仅仅是第一个和最后一个。如果您的字符串曾经包含类似“[[value]..]”的内容,这可能是一个问题 - 您将留下“value]..”。

另一个编辑:如果您确实需要检查字符串的格式是否正确,很容易验证第一个和最后一个字符是方括号:

if ((substr($str, 0, 1) == '[') && (substr($str, -1) == ']')) {
    $str = substr($str, 1, -1);
} else {
    //Something went wrong - the string is not wrapped in [brackets].
}
于 2012-08-17T13:24:44.113 回答
1

您可以使用ltrim () 和rtrim () 函数来摆脱外部括号:

$str = '[(123)[334.5 : 765.1] string]';
$str = ltrim($str, "[");
$str = rtrim($str, "]");
echo $str;
于 2012-08-17T13:24:14.987 回答
-1

来源:https ://www.php.net/manual/en/function.sscanf.php#:~:text=s%20stops%20reading%20at%20any%20whitespace%20character 。

格式
字符串的解释格式,在 sprintf() 的文档中进行了描述,但有以下区别:

[...]

  • s 在任何空白字符处停止读取。

您的格式字符串失败,因为大括号之间有空格字符。

假设string输入字符串末尾的子字符串不包含右大括号,则可以改为使用包含右大括号的否定字符类。

代码:(演示

$str = '[(123)[334.5 : 765.1] string]';

var_export(
    sscanf($str, '[(%d)[%f : %f] %[^]]]')
);

输出:

array (
  0 => 123,
  1 => 334.5,
  2 => 765.1,
  3 => 'string',
)
于 2021-08-23T22:24:28.593 回答