Czy wyrażenie regularne wymienione w wiadomości wyjątku powinno być otoczone apostrofami?

0

Wstęp

Szlifuję własnie swoją bibliotekę, i jak się użyje niepoprawnego wyrażenia regularnego, to chciałbym w wyjątku umieścić to wyrażenie.

Tylko mam teraz zagwostkę, czy pokazać wyrażenie tak jak jest (normalnie), czy otoczyć je apostrofami? Normalnie apostrofy wydają się lepszym pomysłem, bo jawnie pokazuje gdzie się kończy i zaczyna wyrażenie (również z białymi znakami):

Standard use case

regular.gif

Apostrofy w wyrażeniu

Problem się pojawia, co jesli samo wyrażenie ma w sobie apostrofy albo cudzysłowy? Wtedy to wyglądałoby conajmniej dziwnie:

apostrophe.gif

Krótkie wyrażenia

No i też staram się rozważyć bardzo krótkie ciagi, takie które nie wyglądają na wyrażenia regularne:

short.gif

Whitespace'y

Ale znowu z drugiej strony, co jeśli w wyrażeniu są białe znaki i wtedy nie widać gdzie się zaczyna i kończy wyrażenie, np jak dodamy null byte:

whitespace.gif

0

Zdecydowanie otoczyć czymś żeby było wiadomo gdzie się zaczyna i kończy i dało się skopiować. I tu pojawia się pytanie bo powinno być imo to zrobione w ten sposób żeby dało się to wyrażenie wyszukać w kodzie lub wkleić do nowego kodu celem testowania bez zmian, a więc cudzysłowy w środku może wypadałoby escape'ować. Z drugiej strony ktoś może chcieć wkleić wtedy to zapytanie do testera takiego jak https://regex101.com/ a wtedy dodatkowe slashe będą przeszkadzać.

Ja bym się w ogóle zastanowił czy dobrym pomysłem jest pokazywać wyrażenie regularne w treści komunikatu i czy nie stwarza to potencjalnej luki bezpieczeństwa. Taki skrajny przypadek ale taki scenariusz wymyślony na szybko że np jakiś mało doświadczony coder może sobie sklejać regex na podstawie danych z bazy typu '(' + join('|', $secrets) + '|' + $_POST['user_secret'] + ')'. Teraz jak user przez brak dobrej walidacji doda nieprawidłowy znak do formularza czy bazy w jakiś sposób to taki message może wyjawić całą pozostałą listę wartości których nie powinien widzieć. Niby exception nie powinien lecieć na twarz ale jednak bardzo często zwłaszcza na stronkach w php są one widoczne.

Czy w ogóle jest sens pokazywać zapytanie userowi a może wystarczy linijka w kodzie i znak i user sobie sam sprawdzi?

4

Na pewno trzeb je jakoś oznaczyć. A co powiesz na blok wielolinijkowy?

----
TUTAJ IDZIE WYRAŻNIE
----

Jasno widać początek i koniec. W systemach logujących, które wycinają znaki końca linii, masz nietypowy znacznik ----. Jedyne co pozostaje to białe znaki, ale to może być pomijalny problem.

edit:

można się pobawić w ascii arta i przyjąć, że logi wyświetlasz fontem o stałej szerokości znaku:

----------------------
|TUTAJ IDZIE WYRAŻNIE|
----------------------

i wtedy znakami | masz ograniczone wyrażenie, a wielkość tabelki jest równa długości wyrażenia. Oczywiście przy długich wyrażeniach będzie fakap, ale długie wyrażenia same w sobie są fakapem.

5

Widywałem różne błędy tego typu i najczęściej ludzie się nie przejmują podwójnymi cudzysłowami/apostrofami.

Może backticki? Każdy dziś jest przyzwyczajony, że backtick otacza "coś programistycznego", backticki mam wrażenie, że rzadziej będą występować w samych regexach (ale to już moja bańka może być), więc ciężej o "kolizje", a nie jest to takie ciężkie dla oczu jak robienie temu rameczki :)

IMO COŚ musi być, to na pewno i raczej coś prostego.

Ew. możesz pokusić się o antykolizyjną niekonsekwencję - używać ' lub ", lub ` w zależności od tego, co NIE zostało użyte w regexpie. A jak się nie da - to trudno.

0
dzek69 napisał(a):

Widywałem różne błędy tego typu i najczęściej ludzie się nie przejmują podwójnymi cudzysłowami/apostrofami.

Może backticki? Każdy dziś jest przyzwyczajony, że backtick otacza "coś programistycznego", backticki mam wrażenie, że rzadziej będą występować w samych regexach (ale to już moja bańka może być), więc ciężej o "kolizje", a nie jest to takie ciężkie dla oczu jak robienie temu rameczki :)

IMO COŚ musi być, to na pewno i raczej coś prostego.

Ew. możesz pokusić się o antykolizyjną niekonsekwencję - używać ' lub ", lub ` w zależności od tego, co NIE zostało użyte w regexpie. A jak się nie da - to trudno.

@dzek69: A jak myślisz, czy jest sens oznaczać pozycję w wyrażeniu wielolinijkowym?

screenshot-20230922124243.png

1

To już chyba bardziej informacja w formacie Something something on line: 5, col: 15 pod lub nad samym regexpem.

Choć od biedy mógłbyś wstrzyknąć wyraźną "strzałkę", być może z opisem, typu


             [a-z]     # character
             \w+ (?<>) # nick
               ^------------------------ Invalid character
                       # carriage
             https?:// # schema
            

Ważne, żeby to nie był sam znak ^, który zgubi się gdzieś w regexpie źródłowym, tylko wyraźne odróżnienie wstrzykniętego znacznika. Oczywiście "Invalid character" możesz dopasować do tego, co tam się dzieje, tylko wiadomo - musi to być w miarę krótkie. Oczywiście dorzuć pozycję typu 5:15, jeżeli nigdzie dookoła nie zawrzesz tej informacji, czasem np. takie rzeczy mogą być w logach, które z jakiegoś powodu zgubiły białe znaki (przeglądarka) lub wyświetlają się czcionką o różnej szerokości znaków i wychodzi z tego kupa - więc lepiej mieć konkretny odnośnik i odnaleźć to sobie w IDE.

0
dzek69 napisał(a):

To już chyba bardziej informacja w formacie Something something on line: 5, col: 15 pod lub nad samym regexpem.

Choć od biedy mógłbyś wstrzyknąć wyraźną "strzałkę", być może z opisem, typu


             [a-z]     # character
             \w+ (?<>) # nick
               ^------------------------ Invalid character
                       # carriage
             https?:// # schema
            

Ważne, żeby to nie był sam znak ^, który zgubi się gdzieś w regexpie źródłowym, tylko wyraźne odróżnienie wstrzykniętego znacznika. Oczywiście "Invalid character" możesz dopasować do tego, co tam się dzieje, tylko wiadomo - musi to być w miarę krótkie. Oczywiście dorzuć pozycję typu 5:15, jeżeli nigdzie dookoła nie zawrzesz tej informacji, czasem np. takie rzeczy mogą być w logach, które z jakiegoś powodu zgubiły białe znaki (przeglądarka) lub wyświetlają się czcionką o różnej szerokości znaków i wychodzi z tego kupa - więc lepiej mieć konkretny odnośnik i odnaleźć to sobie w IDE.

No nie no, taka strzałka to chyba za dużo kombinowania :/

Masz jakiś inny pomysł?

1 użytkowników online, w tym zalogowanych: 0, gości: 1