微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP中带有数组的字符串之间的字符串,数组顺序为ISSUE

如何解决PHP中带有数组的字符串之间的字符串,数组顺序为ISSUE

我遇到了一个函数,该函数在其他两个字符串之间得到一个字符串

function string_between($str,$starting_word,$ending_word) {
   $subtring_start = strpos($str,$starting_word);
   $subtring_start += strlen($starting_word);
   foreach ($ending_word as $a){
      $size = strpos($str,$a,$subtring_start) - $subtring_start;
   }

   return substr($str,$subtring_start,$size); 
}

问题在于该函数搜索数组中的第一个ending_word。 一个例子将更容易理解:

$array_a = ['the','amen']; // Starting strings
$array_b = [',','.']; // Ending strings
$str = "Hello,the world. Then,it is over.";

预期结果:

"the world."

当前结果:

"the world. Then,"

函数将认为ending_word为“,”,因为它是array_b中遇到的第一个元素。但是,文本首先遇到“。”。在“ the”起始词之后。

无论数组在什么位置,我如何确保函数遍历文本并停止在array_b中$ str的第一个元素处?

有什么主意吗?

解决方法

基本上,当$ size> 0时,您需要跳出foreach循环

这样,当发现第一个事件时,它将停止循环遍历您的数组。这是带有其他修复程序的更完整的代码:

function stringBetween($string,$startingWords,$endingWords) {
    foreach ($startingWords as $startingWord) {
        $subtringStart = strpos($string,$startingWord);
        
        if ($subtringStart > 0) {
            foreach ($endingWords as $endingWord){
                $size = strpos($string,$endingWord,$subtringStart) - $subtringStart + strlen($endingWord);
                if ($size > 0) {
                    break;
                }
            }
            if ($size > 0) {
                return substr($string,$subtringStart,$size);
            }
        }
    }
    return null;
}

$startArr = array('the','amen'); // Starting strings
$endArr = array('.',','); // Ending strings
$str = "Hello,the world. Then,it is over.";

echo stringBetween($str,$startArr,$endArr); // the world.
,

这类问题最好通过PCRE正则表达式解决,函数中只需要几行即可:

function string_between($str,$starts,$ends) {

    preg_match("/(?:{$starts}).*?(?:{$ends})/mi",$str,$m);
    return $m[0];
}

然后像这样打电话:

echo string_between("Hello,it is over.",'the|amen',|\.');

产生:世界。

技巧-搜索正则表达式匹配结束符号的方法是使用正则表达式非贪婪搜索,由模式.*?中的问题符号指示。您甚至可以扩展此函数以接受数组作为开始/结束符号,只是这种情况下的修改功能(可能与implode('|',$arr)一起使用)将符号连接到正则表达式分组公式中。

,

编辑版本

现在可以使用。从第一个数组迭代测试字符串,以查找测试字符串的出现位置。如果找到一个,则从第一个字符串的末尾开始搜索第二个测试字符串。
为了得到最短的命中,我从第二个位置开始存储位置,并取最小的位置。

您可以在http://sandbox.onlinephpfunctions.com/code/0f1e5c97da62b4daaf0e49f52271fe288d1cacbb

尝试一下
$array_a =array('the','amen');
$array_b =array(','.','#');
$str = "Hello,it is over.";

function earchString($str,$array_a,$array_b) {
    forEach($array_a as $test) {
        $pos = strpos($str,$test);
        if ($pos===false) continue;
        $found = [];
        forEach($array_b 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 '';
}

echo earchString($str,$array_b);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。