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

Returning a string after the second occurrence of a character and before the last occurrence of the same character with php

我有几个类似于下面的字符串: ORG-000012 – 变体名称 – 数量:12 包 – $14.95

我需要用 php 删除第二个连字符之前和最后一个连字符之后的所有字符。例如,上面的字符串需要 return 为: 变体名称 – 数量:12 包

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

只需使用explode(),拆分为。然后,得到第二个和第三个元素:

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

Demo

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

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

Demo

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

找到最后一次出现的位置
$s = 'ORG-000012 - Name of variation - Quantity: 12 Pack - .95';
$sub = substr($s,strpos($s, '-')+1, strrpos($s, '-')-strlen($s));
print $sub; // or print trim($sub) to remove the whitespaces

它的作用是,它将打印 $s 的子字符串,从第一次出现的 - 字符之后的一个字符开始,并省略最后一次出现的 - 的字符将负值(字符串总长度与最后一次出现 - 字符的位置之差)作为长度传递给 substr.

请注意,这也会打印最后一个 - 之前的 space 字符,因此您可能还想 trim 结果。

可以使用正则表达式,尝试使用:

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