我试图爆炸一个字符串,但我只需要在最后'and'
而不是每个'and'
进行爆炸。有没有办法做到这一点?
<?php
$string = "one and two and three and four and five";
$string = explode(" and ", $string);
print_r($string);
?>
结果:
数组([0] =&gt;一[1] =&gt;二[2] =&gt;三[3] =&gt;四[4] =&gt;五)
需要结果:
数组([0] =&gt;一,二,三,四[1] =&gt;五)
答案 0 :(得分:5)
这似乎很容易使用基本的字符串函数。
$x = strrpos($string, ' and ');
$s2 = array(substr($string, 0, $x), substr($string, $x + 5));
答案 1 :(得分:1)
我的方法更简单一点,使用preg_match_all()
代替简单的正则表达式:
$string = "one and two and three and four and five";
$pattern = '/(\w+\s)+/';
preg_match_all($pattern, $string, $matches);
$length = strlen($matches[0][0]);
echo $matches[0][0]; // 'one and two and three and four and'
echo substr($string, $length); // 'five'
这里唯一的问题是第一场比赛还有一个尾随&#39;和&#39;如果需要,可以通过一些简单的编码来摆脱它。如果你想要更复杂的正则表达式,你可以使用积极的前瞻和消极的外观。
答案 2 :(得分:1)
您还可以使用preg_split
:
$string = "one,two,three,four,five";
$delimiter = ",";
// The regexp will look like this: /,([^,]+)$/
$array = preg_split("/".$delimiter."([^".$delimiter."]+)$/", $string,
-1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
print_r($array);
正则表达式将最后一个分隔符与最后一个项目匹配,但仅捕获该项目,以便通过PREG_SPLIT_DELIM_CAPTURE将其保留在结果中。
PREG_SPLIT_NO_EMPTY就在那里,因为我不知道为什么,分裂在结尾处给出一个空字符串。
正则表达式必须在这里进行调整,使用负面外观(如this answer中所述):
$string = "one and two and three and four and five";
$delimiter = " and ";
$array = preg_split("/$delimiter((?(?!$delimiter).)*$)/", $string,
-1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
print_r($array);
(?(?!$delimiter).)*
表示:仅匹配不启动单词$delimiter
的字符。第一个?
会阻止捕获其他组。
答案 3 :(得分:0)
我不知道是否有其他快速方法可以解决这个问题,但您可以尝试下面的代码;
$string = "one and two and three and four and five";
$stringArray = explode(" and ", $string);
$stringArrayItemCount = count($stringArray);
//Keep your last item
$stringArrayLastItem = $stringArray[$stringArrayItemCount-1];
//Remove last item from your array
unset($stringArray[$stringArrayItemCount-1]);
//Create new array imploding existing one + last item of your old array
$stringArray = array(implode(" and ",$stringArray),$stringArrayLastItem);
print_r($stringArray);
此示例的工作版本:http://ideone.com/qdZFtk
希望这有帮助。
答案 4 :(得分:0)
写了一个函数来做到这一点:
<?php
$string = "one and two and three and four and five";
$string = explodeLast(" and ", $string);
echo $string;
function explodeLast($explodeAt, $string) {
$explode = explode($explodeAt, $string);
$count = count($explode);
$counter = 0;
$string = null;
while ($counter < $count-1) {
if ($counter < $count-2) {
$string .= $explode[$counter].$explodeAt;
} //end of if ($counter < $count-2)
else {
$string .= $explode[$counter];
} //end of else not ($counter < $count-2)
$counter++;
} //end of while ($counter < $count)
return $string;
} //end of function explodeLast($explode, $explodeAt)
?>
答案 5 :(得分:0)
这应该有效:
$str = 'one and two and three and four and five';
$breakWord = ' and ';
$output = str_split($str, strrpos($str, $breakWord) + strlen($breakWord));
var_dump($output);
http://sandbox.onlinephpfunctions.com/code/0149b3ff973485befe97a1c6b241a6764bd2f289
编辑 - 正则表达式使用:
<?php
$str = 'one and two and three and four and the last part is actually longer than the first part';
$pattern = "/(.+) and (?!.* and )(.+)/";
preg_match($pattern, $str, $matches);
var_dump($matches);
http://sandbox.onlinephpfunctions.com/code/0bc68f46fe594e360134bdca256e5916a2f42f74