如何使用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
相关产品推荐
相关产品推荐

