如何解决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 举报,一经查实,本站将立刻删除。