Я изо всех сил пытаюсь создать регулярное выражение, чтобы соответствовать этому:
строка: this-string-ends-1c25e41b-f5b2-4484-b5b8-7d45ac2dd427
должен вернуть: 1c25e41b-f5b2-4484-b5b8-7d45ac2dd427
т.е. вернуть все после 4-го символа «-» с конца.
Я попробовал это:
([^-]*$)
Но это просто совпадает с первого раза. Обратите внимание, что первые 3 элемента (this-string-end) могут иметь любой диапазон значений
Попробуйте следующее с 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)
С 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
Как насчет:
$string = 'this-string-ends-1c25e41b-f5b2-4484-b5b8-7d45ac2dd427';
$string = preg_replace('/^.*?-((?:[^-]*-){4}[^-]*)$/', "$1", $string);
echo $string,"\n";
Выход:
1c25e41b-f5b2-4484-b5b8-7d45ac2dd427
Использование:
[^-]*-[^-]*-[^-]*-[^-]*-[^-]*$
Регулярное выражение ищет строку, у которой строка символов отличается от ‘-‘ ([^-]*
), с последующим -
с последующим тем же шаблоном 4 раза, затем строка заканчивается ($
)
Тестирование на: https://regex101.com/r/49fCit/2 ,выход:
1c25e41b-f5b2-4484-b5b8-7d45lac2dd427
Попробуй это
([0-9a-zA-Z]*-[0-9a-zA-Z]*){4}$
Это займет последние 4 дефиса с комбинацией букв или цифр (или нет) между
Вы хотите извлечь подстроку из пяти групп шестнадцатеричных символов, разделенных четырьмя дефисами в конце строки. Вы можете сделать это с preg_match
:
if ( preg_match('~(?>[^-]+-?\b){5}$~', $str, $m) )
echo $m[0];
Вы также можете быть более явным, используя [[:xdigit:]]
на месте [^-]
,