Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中字符串与数组之间的字符串,数组顺序问题_Php_String_Function - Fatal编程技术网

PHP中字符串与数组之间的字符串,数组顺序问题

PHP中字符串与数组之间的字符串,数组顺序问题,php,string,function,Php,String,Function,我面临一个函数的问题,该函数在另外两个字符串之间获得一个字符串 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,

我面临一个函数的问题,该函数在另外两个字符串之间获得一个字符串

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); 
}
问题在于,该函数会搜索数组中的第一个结束单词。 一个例子更容易理解:

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

"the world."
当前结果:

"the world. Then,"
函数会认为结尾的单词是“”,因为它是数组中遇到的第一个元素。但是,文本在“the”起始词之后遇到第一个“.”

如何确保函数遍历文本并在数组_b中存在的$str中的第一个元素处停止,而不考虑数组中的位置


有什么想法吗?

编辑版

现在可以了。从第一个数组遍历teststring,从teststring中查找发生位置。如果找到第二个测试字符串,则从第一个字符串的末尾开始在起始位置搜索第二个测试字符串。
为了获得最短的命中率,我从第二个位置开始存储位置,然后取最小值

你可以试试看


基本上,当$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, the world. Then, it is over.", 'the|amen', ',|\.');
生产:世界


技巧,-搜索到最近匹配的结束符号是用regex非贪婪seach完成的,由模式
*?
中的问号表示。您甚至可以扩展此函数以接受数组作为起始/结束符号,仅此情况下,可以使用modify函数(可能使用
内爆('|',$arr)
)将符号连接到正则表达式分组公式中。

您能给出更多示例吗?它是第一个起始词和第一个结束词之间的字符串吗?不太清楚你们想要达到什么目的。为什么有一系列的起始词和结束词?使用
amen
会发生什么?请再给出1-2个示例字符串,以及它们应该发生什么。它非常好@Sascha thx,因为它花费了一些时间:)
echo string_between("Hello, the world. Then, it is over.", 'the|amen', ',|\.');