#regex #string
#регулярное выражение #строка
Вопрос:
Я пытаюсь создать регулярное выражение (с чем я всегда борюсь), чтобы возвращать все после последнего дефиса.
Например, это были бы входные строки:https://mywebsite.com/company/company-name-page-ddd.l
https://mywebsite.com/company/another-company-page-lloy.l
и я хотел бы вернуть только ddd.l или во 2-м примере lloy.l
Я думал, что это будет что-то вроде ^-([a-zA-Z0-9-.=^$] )/?$ но это не решает первую часть URL и каталога.
Это должно быть чистое регулярное выражение, поэтому никакого php, поскольку он используется в качестве фильтра в плагине WordPress на стороне пользователя.
Кто-нибудь может помочь?
Комментарии:
1. Может ли это быть просто
[^-] $
?2. @JvdV Нет, как общее решение, которое не будет работать, потому что оно вернет все перед первым дефисом, а не последним.
3. @TimBiegeleisen, как же так? Может быть, я просто неправильно читаю этот вопрос, но это то, что он вернет, что соответствует тому, что, по-видимому, после OP.
Ответ №1:
Вы могли бы развернуть якоря и заканчивать на $
вместо того, чтобы начинать с ^
Затем вы должны удалить -
из класса character. Значение находится в группе 1.
-([a-zA-Z0-9.=^$] )$
Демонстрация регулярных выражений
Если поддерживается, вы также можете сопоставить дефис и использовать K
или использовать положительный взгляд назад, чтобы указать дефис слева (?<=-)
и опустить группу, чтобы получить только совпадение
-K[a-zA-Z0-9.=^$] $
или (?<=-)[a-zA-Z0-9.=^$] $
Как ранее php был помечен:
$strings = [
"https://mywebsite.com/company/company-name-page-ddd.l",
"https://mywebsite.com/company/another-company-page-lloy.l"
];
foreach ($strings as $s) {
preg_match("~-K[a-zA-Z0-9.=^$] $~", $s, $match);
echo $match[0] . PHP_EOL;
}
Вывод
ddd.l
lloy.l
Ответ №2:
Я бы использовал preg_replace
здесь, чтобы удалить все содержимое с начала ввода до последнего тире включительно:
$input = "Some text here - and other text as well - the end";
$output = preg_replace("/^.*-/", "", $input);
echo $input . "n" . $output;
Это печатает:
Some text here - and other text as well - the end
the end
Комментарии:
1. извините, мне пришлось пересмотреть вопрос, поскольку это невозможно сделать в php — просто регулярное выражение
2. Затем используйте
^.*-(.*)$
, и то, что вы хотите, будет в первой группе захвата.
Ответ №3:
я думаю, ваша проблема в том, что вы начали выражение с ^-
, поэтому оно не совпало.
Если я прочитаю описание вашей проблемы, я думаю, вы хотите, чтобы вся строка полностью совпадала, но только часть после последнего дефиса в соответствующей группе. Для этого я рекомендую начать с ^.*
, чтобы перехватить все в начале.
таким образом, полное регулярное выражение будет:
^.*-([w.] )$
Я действительно рекомендую отменитьhttps://regex101.com / разработать регулярное выражение.
php > preg_match('/^.*-([w.] )$/', "https://mywebsite.com/company/company-name-
page-ddd.l" , $matches);
php > print_r($matches);
Array
(
[0] => https://mywebsite.com/company/company-name-page-ddd.l
[1] => ddd.l
)
Ответ №4:
^.*(-.*)$
Объяснение: подтвердите начало строки, затем выберите любой символ 0 или более раз, за которым следует (и начните захват) дефис, за которым следует любой символ 0 или более раз (и закройте захват), и подтвердите конец строки.
В первой группе захвата будет то, что вам нужно.