Возвращает строку после второго вхождения символа и перед последним вхождением того же символа в php


У меня есть несколько строк, похожих на следующие: ORG-000012-название вариации-Количество: 12 упаковок - $14.95

Мне нужно удалить все символы перед вторым дефисом и после последнего дефиса с помощью php. Например, приведенная выше строка должна возвращать вид: Название вариации-Количество: 12 упаковок

Я пытался использовать strpos и substr, но, похоже, не могу получить правильную настройку. Пожалуйста, помогите!

3 3

3 ответа:

Просто используйте 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"

Демо

Или, если число элементов между ними переменно, 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);

Демо

Вы можете найти положение первого вхождения - char, используя 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 результат.

Возможно с 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