W mojej aplikacji mamy szablon; gdzie użytkownik może edytować, a następnie zapisać go do DB. Szablon jest następnie używany przez naszą aplikację do wysyłania zaproszeń e-mail.

Oto szablon projektu:

Dear {USER FIRST NAME} {USER LAST NAME}: 

{COLLEGE NAME} is providing your access to `example` services, including a dedicated online account. Registration was started for you. 

Without delay, please finish the last few items of your registration. 

Please promptly
finish your registration here: {REGISTRATION URL} 

Also, please {LOG IN} for the first time, to be sure you encounter no issues. If you have questions, Support@example.com is available to help. Once you finish registration, access to your secure account and related example member services will stay with you as you proceed through learning experiences, within and beyond coursework. Thank you

Tuż przed wysłaniem zaproszeń aplikacja zastępuje klucze z prawdziwymi danymi użytkownika. Jak {USER FIRST NAME} zastępuje się RAHUL i tak dalej.

Problem, który stoję, jest ... Użytkownik edytuje szablon i dodaje kropkę (.) Na końcu {REGISTRATION URL}.

LUBIĘ TO:

Please promptly finish your registration here: {REGISTRATION URL}.

W końcu okazuje się być https://www.example.com/reg?invite_id=1f2sdfg23. w treści e-mail. Kod zaproszenia jest teraz uszkodzony. To powoduje problem dla użytkownika, ponieważ pojawi się komunikat o błędzie. Zaproś nie znaleziono strony.

Jak mogę zawierać tę sytuację. Poinformowaliśmy użytkownika, aby tego nie robić, ale chcę wyprzedzić sytuację, nawet jeśli użytkownik nieświadomie to robi. Nie chcę żadnej liczby numerycznej nie-alfa po 1f2sdfg23. Powinien być zawsze następuje przerwa w linii.

Wypróbowałem poniższe wyrażenie regularne:

    $email_body =~ s/\{REGISTRATION URL\}([^a-zA-Z])/$registration_url/ieg;

Praca dla jednej instancji Dot.

Co jeśli użytkownik wejdzie wiele kropek Please promptly finish your registration here: {REGISTRATION URL}... {REGISTRATION URL}# etc..

$email_body =~ s/\{REGISTRATION URL\}([^a-zA-Z]+)/$registration_url/ieg;

Jeśli rozszerzam filtr, umożliwiając wiele znaków, usuwa niechciane znaki. Ale problem, ponowne wystąpi, gdy użytkownik natychmiast podał {REGISTRATION URL}. Powyższa linia kodu usunie odstęp linii. Nie chcę tego robić.

daj mi znać najlepsze podejście, które mogę zastosować tutaj. Z góry dziękuję.

2
Ash_and_Perl 19 luty 2018, 12:30

3 odpowiedzi

Najlepsza odpowiedź

Jak napisał w komentarzu - widzę dwa rozwiązania

1) Dodaj miejsce po zmiennej

($email_body =~ s/\{REGISTRATION URL\}/$registration_url.' '/ieg;) 

2) Wymień z przestrzenią wszystkim, co nie jest białe znaki

($email_body =~ s/\{REGISTRATION URL\}\S+/$registration_url/ieg)
1
mrzasa 19 luty 2018, 11:56

Wspólną konwencją jest osadzenie adresów URL w <brokets> w zwykłym tekście, aby pokazać dokładnie, gdzie rozpoczyna się i kończy adres URL.

No misunderstanding: <http://stackoverflow.com/>!
1
tripleee 19 luty 2018, 12:59

Być może najlepszym podejściem będzie sprawdzenie pliku przed rozpoczęciem procesu wymiany tych zmiennych. Jeśli spodziewasz się, że linia będzie finish your registration here: {REGISTRATION URL}, możesz sprawdzić, czy ta linia jest tym, czego oczekiwałeś: $checkEmailTag =~ /\s\{REGISTRATION URL\}$/. W tym przypadku poprzednią przestrzeń, a następnie tag, a następnie koniec linii.

Jeśli nie jest to, możesz rzucić błąd stwierdzający plik, jest uszkodzony i przerwać proces lub dodać przestrzeń, aby znaki użytkownika nie skrzywdzili adresu URL, umożliwiając kontynuowanie lub jakiekolwiek inne działania, które widzisz.

Nie musisz tego robić dla każdej zmiennej w swoim pliku, tylko dla zmiennych krytycznych jak ten.

0
Jorge_Freitas 19 luty 2018, 12:15