首页 > 解决方案 > 如何使用起始和结束词数组PHP查找字符串中的所有子字符串

问题描述

我已经花了最后 4 个小时来弄清楚如何......我现在必须寻求你的帮助。

我试图从文本中提取多个子字符串匹配我的starting_words_array 和ending_words_array。

$str = "Do you see that ? Indeed, I can see that, as well as this." ;
$starting_words_array = array('do','I');
$ending_words_array = array('?',',');

预期输出:array ([0] => '你看到了吗?' [1] => '我可以看到,')

我设法编写了第一个函数,该函数可以找到与两个数组项中的一个匹配的第一个子字符串。但我无法找到如何循环它以获得符合我要求的所有子字符串。

   function SearchString($str, $starting_words_array, $ending_words_array ) {
   forEach($starting_words_array as $test) {
     $pos = strpos($str, $test);
     if ($pos===false) continue;
     $found = [];
     forEach($ending_words_array  as $test2) {
        $posStart = $pos+strlen($test);
        $pos2 = strpos($str, $test2, $posStart);
        $found[] = ($pos2!==false) ? $pos2 : INF;
     }
     $min = min($found);
     if ($min !== INF)
        return substr($str,$pos,$min-$pos) .$str[$min];
  }
  return '';
}

你们对如何实现这样的事情有任何想法吗?

标签: phparraysloopssubstring

解决方案


我使用 preg_match 作为我的解决方案。但是,开始和结束字符串必须使用 preg_quote 进行转义。否则,解决方案将是错误的。

function searchString($str, $starting_words_array, $ending_words_array ) {
   $resArr = [];
   forEach($starting_words_array as $i => $start) {
     $end = $ending_words_array[$i] ?? "";
     $regEx = '~'.preg_quote($start,"~").".*".preg_quote($end,"~").'~iu';
     if(preg_match_all($regEx,$str,$match)){
       $resArr[] = $match[0];
     }
   }
return $resArr;
}

结果是提问者所期望的。

如果表达式可以多次出现,则还必须使用 preg_match_all。必须修改正则表达式。

function searchString($str, $starting_words_array, $ending_words_array ) {
   $resArr = [];
   forEach($starting_words_array as $i => $start) {
     $end = $ending_words_array[$i] ?? "";
     $regEx = '~'.preg_quote($start,"~").".*?".preg_quote($end,"~").'~iu';
     if(preg_match_all($regEx,$str,$match)){
       $resArr = array_merge($resArr,$match[0]);
     }
   }
return $resArr;
}

第二种变体的结果:

array (
  0 => "Do you see that ?",
  1 => "Indeed,",
  2 => "I can see that,",
)

推荐阅读