You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PHP从字符串中提取两个目标单词?提取第二个时返回空

解决PHP提取状态字符串中两个目标值的问题

问题分析

你之前提取第二个值的代码存在两处核心错误:

  • strpos($str, '', $subtring_start) 无法定位字符串末尾,空字符串的匹配位置就是传入的起始位置,导致计算出的$size为0,最终substr返回空值
  • 起始位置错误地使用了第一个状态$a的位置,应该从to这个标记之后开始截取

另外你最初提取第一个值时,用.拼接strpos结果和长度是错误的(这会把数值转成字符串拼接,导致起始位置计算偏差),应该用+做数值相加。

解决方案

方法一:修正原有字符串处理逻辑

沿用你最初的字符串定位思路,调整提取逻辑:

$str = 'Status Changed from Open to On Hold';

// 提取第一个状态:Open
$starting_word = 'Status Changed from';
$ending_word = 'to';

// 修正:用+做数值相加,而非字符串拼接
$substring_start = strpos($str, $starting_word) + strlen($starting_word);
$size = strpos($str, $ending_word, $substring_start) - $substring_start; 
$a = trim(substr($str, $substring_start, $size)); // trim去除前后空格

// 提取第二个状态:On Hold
$to_position = strpos($str, $ending_word);
$b_start = $to_position + strlen($ending_word);
$b = trim(substr($str, $b_start)); // 截取从to之后到字符串末尾的内容

echo $a; // 输出 Open
echo $b; // 输出 On Hold

方法二:使用字符串分割(explode)

适合格式固定的场景,通过数组分割提取目标内容:

$str = 'Status Changed from Open to On Hold';
$word_parts = explode(' ', $str);

// 找到from和to在数组中的索引
$from_idx = array_search('from', $word_parts);
$to_idx = array_search('to', $word_parts);

// 提取from之后到to之前的内容
$a = trim(implode(' ', array_slice($word_parts, $from_idx + 1, $to_idx - $from_idx - 1)));
// 提取to之后的所有内容
$b = trim(implode(' ', array_slice($word_parts, $to_idx + 1)));

echo $a; // Open
echo $b; // On Hold

方法三:正则表达式(最灵活)

如果状态文本可能包含特殊字符或格式有小变动,正则表达式是最优选择:

$str = 'Status Changed from Open to On Hold';
// 捕获from到to之间的内容,以及to之后的所有内容
preg_match('/Status Changed from (.*?) to (.*)/', $str, $matches);

$a = trim($matches[1]);
$b = trim($matches[2]);

echo $a; // Open
echo $b; // On Hold

内容的提问来源于stack exchange,提问作者charlie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:10:23