使用这样的字符串:
$sentence='StartDetails text 1 EndDetails StartDetails text 2 EndDetails StartDetails text 3 EndDetails StartDetails text 4 EndDetails';
即使在字符串上出现n次,StartDetails
和EndDetails
个单词之间的文本也如何获得?
答案 0 :(得分:1)
正则表达式应该有所帮助,请尝试以下操作:
$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);
到
preg_match_all('/StartDetails(.*)EndDetails/U', $sentence, $outputArray);
答案 1 :(得分:1)
假设您的String始终具有相同的结构: 可以在循环中使用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
)
答案 2 :(得分:0)
尝试使用此正则表达式(?<=StartDetails\s).*?(?=\s+EndDetails)
。它匹配StartDetails
和EndDetails
之间的所有内容。正则表达式使用Lookahead和Lookbehind模式来匹配多个值。
然后在PHP中使用preg_match_all
。
答案 3 :(得分:0)
您可以使用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
)