/ / Używanie wyrażenia regularnego w celu dopasowania położenia z opcjonalną sublokacją - regex, url

Korzystanie z wyrażenia regularnego w celu dopasowania lokalizacji do opcjonalnej sublokacji - regex, url

Chcę przekierować /spam/(.*) do /$1 (włącznie z /spam/ do /) i /spam do /, ale nie /spam(.*) do $1 lub /$1.

Więc /spam/eggs/bacon staje się /eggs/bacon, /spam/ i /spam oba stają się /, i spameggs/bacon nie staje się eggs/bacon.

Jakie wyrażenie regularne (chars) do $1 Para to osiąga?

Odpowiedzi:

0 dla odpowiedzi № 1

Wzór: /spam(?:/(.*)|()$)

Zastąpić: /$1

To zastąpi poprawnie, jest najprostszym zrozwiązania opublikowane do tej pory, i ma dodatkową premię, że mecz się nie powiedzie, jeśli ścieżka nie jest w formie, którą rozważasz (tj. jeśli nie pasuje do /spam lub /spam/___)


1 dla odpowiedzi nr 2

Nie jestem pewien co do smaku RegExp, ale spróbuję czegoś takiego ...

/(spam($|/))?(.*) ==> /$3

Oto przykład PHP.

$rx = "~/(spam($|/))?(.*)~";
$arr = array(
"/spam",
"/spam/",
"/spam/eggs/bacon",
"spameggs/bacon",
"/spameggs/bacon"
);
foreach ($arr as $val) {
echo "<b>Before:</b> $valn<b>After:</b> " . preg_replace($rx,"/$3",$val) . PHP_EOL.PHP_EOL;
}

wyniki

Przed: /spam
Po: /

Przed: /spam/
Po: /

Przed: / spam / jaja / boczek
Po: / jajka / bekon

Przed: spameggs / bekon
Po: spameggs / bekon

Przed: / spameggs / bekon
Po: / spameggs / bekon


1 dla odpowiedzi nr 3

Dość proste: ^.*((?<=^/spam/).*|(?<=^/spam))$ do /$1

Test (http://ideone.com/YqAAA):

"/spam"          --> "/"
"/spam/"         --> "/"
"/spam/one"      --> "/one"
"/spam/one/two"  --> "/one/two"