Соответствие регулярному выражению в обратном порядке после символа x

Я изо всех сил пытаюсь создать регулярное выражение, чтобы соответствовать этому:

строка: this-string-ends-1c25e41b-f5b2-4484-b5b8-7d45ac2dd427

должен вернуть: 1c25e41b-f5b2-4484-b5b8-7d45ac2dd427

т.е. вернуть все после 4-го символа «-» с конца.

Я попробовал это:

([^-]*$)

Но это просто совпадает с первого раза. Обратите внимание, что первые 3 элемента (this-string-end) могут иметь любой диапазон значений

1

Решение

Попробуйте следующее с preg_match(DEMO):

$str = 'this-string-ends-1c25e41b-f5b2-4484-b5b8-7d45ac2dd427';
preg_match('/([^-]+(?:-[^-]+){4})$/', $str, $matches);

var_dump($matches);

Выход:

array (size=2)
0 => string '1c25e41b-f5b2-4484-b5b8-7d45ac2dd427' (length=36)
1 => string '1c25e41b-f5b2-4484-b5b8-7d45ac2dd427' (length=36)

Решение без регулярных выражений: Вот решение с использованием implode, explode а также strrev:

$str = 'this-string-ends-1c25e41b-f5b2-4484-b5b8-7d45ac2dd427';
$str = strrev($str);
$arr = explode('-', $str, 6);
unset($arr[5]);
$imp = implode('-', $arr);
$matched = strrev($imp);

var_dump($matched);

Выход:

string '1c25e41b-f5b2-4484-b5b8-7d45ac2dd427' (length=36)
1

Другие решения

С preg_replace функция:

$s = 'this-string-ends-1c25e41b-f5b2-4484-b5b8-7d45ac2dd427';
$result = preg_replace('/.*?([^-]+(?:-[^-]+){4})$/', '$1', $s);

print_r($result);

Выход:

1c25e41b-f5b2-4484-b5b8-7d45ac2dd427

бонус решение с explode, implode а также array_slice функции:

$s = 'this-string-ends-1c25e41b-f5b2-4484-b5b8-7d45ac2dd427';
$chunks = explode('-', $s);
$result = (count($chunks) >= 5)? implode('-', array_slice($chunks, -5)) : "";

print_r($result);

Выход:

1c25e41b-f5b2-4484-b5b8-7d45ac2dd427
2

Как насчет:

$string     = 'this-string-ends-1c25e41b-f5b2-4484-b5b8-7d45ac2dd427';
$string = preg_replace('/^.*?-((?:[^-]*-){4}[^-]*)$/', "$1", $string);
echo $string,"\n";

Выход:

1c25e41b-f5b2-4484-b5b8-7d45ac2dd427
0

Использование:

[^-]*-[^-]*-[^-]*-[^-]*-[^-]*$

Регулярное выражение ищет строку, у которой строка символов отличается от ‘-‘ ([^-]*), с последующим -с последующим тем же шаблоном 4 раза, затем строка заканчивается ($)

Тестирование на: https://regex101.com/r/49fCit/2 ,выход:

1c25e41b-f5b2-4484-b5b8-7d45lac2dd427
0

Попробуй это

([0-9a-zA-Z]*-[0-9a-zA-Z]*){4}$

Это займет последние 4 дефиса с комбинацией букв или цифр (или нет) между

введите описание изображения здесь

0

Вы хотите извлечь подстроку из пяти групп шестнадцатеричных символов, разделенных четырьмя дефисами в конце строки. Вы можете сделать это с preg_match:

if ( preg_match('~(?>[^-]+-?\b){5}$~', $str, $m) )
echo $m[0];

Вы также можете быть более явным, используя [[:xdigit:]] на месте [^-],

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector