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', ',|\.');