Добрый день, люди добрые. В регулярных выражениях недавно, мучает одна строка... ну ни как не поддаётся.
preg_match("/^([A-z_0-9\$\s\-]+)(|\-([a-z24]+))$/i", $urlprop['func'], $urllogin22);
Вот собственно строка регулярки.
В urlprop хранится строка урл, в которой может быть 2 положения:
Проблема кроется в том что название товара может содержать тире "-" и регулярка уже не разбивает урл на "названиеТовара" и "Опция".
Подскажите что в моём выражении не так и как это можно было бы исправить?
Думаю изначально проблема не в регулярном выражении, а в логике, приведу пример для наглядности: Есть вот такие URL:
Товар-Опция
Товар-товар-Опция
Товар-товар-товар-Опция
И с помощью Look ahead мы делим строку по последнему знаку -:
preg_match("/^(.*)(?=-)[-*](.*)$/i", $urlprop['func'], $urllogin22);
var_dump($urllogin22);
array(3) {
[0]=>
string(12) "Товар-Опция"
[1]=>
string(5) "Товар"
[2]=>
string(6) "Опция"
}
Во всех 3х вариантах отработает всё как нужно, но если будет товар который без категории:
Товар-товар
И товар с категорией с первого примера:
Товар-Опция
Для регулярки это тоже самое, вам нужно менять структуру url чтобы понимать точно где товар где опция.
За самый рабочий ответ спасибо Nik'у
$opt = str_replace('-','',substr($urlprop['func'], strrpos($urlprop['func'], '-')));
$options = array('option1','option2','option3','option4');
if(in_array($opt,$options)){
// если есть опция
}else{
// если последнее слово после тире не подходит ни под одну из опций
}
как оказалось проще решить эту проблему вообще без регулярного выражения =)
Если строка имеет формат "Название-товара-Опция", то в имя товара будет сохранена часть "Название-товара", а в опцию "Опция".
Если опция не указана, то в имени товара будет строка "Название-товара"
$str = 'НазваниеТовара-Опция';
$option = '';
preg_match_all('~\w+-?\w+~u', $str, $a);
count($a[0]) > 1 ? list($name, $option) = $a[0] : $name = $a[0];
var_dump($name, $option);
UPD: Если опции заранее известны, тогда можно обойтись без регулярных выражений:
$url = 'НазваниеТовара-option1';
$temp = explode('-', $url);
$option = array_pop($temp);
$options = ['option1', 'option2', 'option3', 'option4'];
if (($k = array_search($option, $options)) !== false) {
echo 'Товар: '. join($temp) . '<br>Опции: ' . $options[$k];
}
Можно воспользоваться preg_split c Negative Lookahead, который найдет последний дефис в строке
list($name, $option) = preg_split('/\-(?!.*\-)/', 'Название-товара-Опция');
echo $name.'<>',$option; // Название-товара<>Опция
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники