用这样的字符串:
$sentence='StartDetails text 1 EndDetails StartDetails text 2 EndDetails StartDetails text 3 EndDetails StartDetails text 4 EndDetails';
即使在字符串上出现n个次数,我如何在 StartDetails
和 EndDetails
单词之间获得文本?
假设您的字符串始终具有相同的结构:在循环中使用Explode((是一个可能的选择:
$sentence='StartDetails text 1 EndDetails StartDetails text 2 EndDetails StartDetails text 3 EndDetails StartDetails text 4 EndDetails';
$a = explode("StartDetails", $sentence);
foreach($a as $k=>$v){
if(!empty($v)){
$b[] = explode( "EndDetails", $v)[0];
}
}
print_r($b);
// output
Array
(
[0] => text 1
[1] => text 2
[2] => text 3
[3] => text 4
)
正则表达式应有所帮助,尝试以下操作:
$sentence='StartDetails text 1 EndDetails StartDetails text 2 EndDetails StartDetails text 3 EndDetails StartDetails text 4 EndDetails';
preg_match_all('/StartDetails(.*)EndDetails/U', $sentence, $outputArray);
print_r($outputArray);
在$outputArray
中,第二个元素应该是StartDetails和EndDetails之间所有可能文本的数组。
这里要注意的关键是使用U
修饰符,这使得匹配贪婪和preg_match_all
功能,而不仅仅是preg_match
,它匹配所有匹配所有出现
编辑
由于我们不需要匹配startdetails或enddetails,所以我更改了此
preg_match_all('/(StartDetails)(.*)(EndDetails)/U', $sentence, $outputArray);
to
preg_match_all('/StartDetails(.*)EndDetails/U', $sentence, $outputArray);
尝试此正则 (?<=StartDetailss).*?(?=s+EndDetails)
。它与StartDetails
和EndDetails
之间的所有内容匹配。REGEX使用LookAhead和LookBehind模式匹配多个值。
然后在php。
preg_match_all
您可以使用array_walk
,explode
$senteanceToArray = array_filter(explode('StartDetails',$sentence));
array_walk($senteanceToArray, function(&$v, $k){
return $v = trim(str_replace('EndDetails', '', $v));
});
echo '<pre>';
print_r($senteanceToArray);
您还可以使用str_replace
$sentence='StartDetails text 1 EndDetails StartDetails text 2 EndDetails StartDetails text 3 EndDetails StartDetails text 4 EndDetails';
$patterns = ['StartDetails','EndDetails'];
$replacements = ['','#'];
$words = array_map('trim', array_filter(explode("#",str_replace($patterns, $replacements, $sentence))));
结果: -
Array
(
[0] => text 1
[1] => text 2
[2] => text 3
[3] => text 4
)