在第二次出现一个字符之后和最后一次出现相同字符之前使用php返回一个字符串

时间:2017-09-17 20:27:24

标签: php string substr strpos

我有几个类似于以下的字符串: ORG-000012 - 变种名称 - 数量:12包 - 14.95美元

我需要在第二个连字符之前和最后一个连字符之后删除所有字符。例如,上面的字符串需要返回为: 变异名称 - 数量:12包

我曾尝试使用strpos和substr,但似乎无法获得正确的设置。请帮忙!

3 个答案:

答案 0 :(得分:1)

只需使用explode(),按拆分即可。然后,获取第二个和第三个元素:

<?php
$description = "ORG-000012 – Name of variation – Quantity: 12 Pack – $14.95";
$descriptionArray = explode(" – ", $description);
$finalDescription = $descriptionArray[1]." – ".$descriptionArray[2];
var_dump($finalDescription); // string(39) "Name of variation – Quantity: 12 Pack"

Demo

或者,如果两者之间的元素数量是可变的,array_shift()array_pop()数组将删除第一个和最后一个元素:

<?php
$description = "ORG-000012 – Name of variation – Quantity: 12 Pack – $14.95";
$descriptionArray = explode(" – ", $description);
array_pop($descriptionArray);
array_shift($descriptionArray);
var_dump($descriptionArray);

Demo

答案 1 :(得分:1)

您可以使用-找到第一次出现strpos字符的位置,并使用strrpos查找最后一次出现的位置:

$s = 'ORG-000012 - Name of variation - Quantity: 12 Pack - $14.95';
$sub = substr($s,strpos($s, '-')+1, strrpos($s, '-')-strlen($s));
print $sub; // or print trim($sub) to remove the whitespaces

它的作用是,它会在第一次出现$s字符后从一个字符开始打印-的子字符串,并通过传递一个字符来省略上次出现-的字符负值(字符串总长度与最后一次出现-字符的位置的差异)作为substr的长度。

请注意,这也将在最后一个-之前打印空格字符,因此您可能也希望trim结果。

答案 2 :(得分:1)

可以使用reg expr,尝试使用:

preg_match(
    '/(?<=\s–\s)(.*)(?:\s–\s)[^\s]+$/',
    'ORG-000012 – Name of variation – Quantity: 12 Pack – $14.95',
    $matches
);
echo $matches[1]; //Name of variation – Quantity: 12 Pack