2009-10-12 10 views
6

Próbuję zawinąć ciąg znaków wprowadzany przez użytkownika w podwójny cudzysłów, ale chcę się upewnić, że nie zakończę podwójnymi cudzysłowami po obu stronach łańcucha. Na przykład, jeśli postów użytkownikaPHP Zawijanie ciągów w podwójnych cudzysłowach

"Hello"

Nie chcę, aby włączyć go do

"" Hello ""

mogę rób to dość łatwo za pomocą kodu poniżej, jednak obawiam się, że może to zwolnić, jeśli przechodzę przez wiele ciągów.

$string = '"'.trim($string,'"').'"'; 

Jeśli ktoś ma lepszy sposób robienia tego, byłoby świetnie. Podobnie, jeśli ktokolwiek może potwierdzić, że moja droga jest w porządku, będę szczęśliwy.

Dzięki

+1

Jeżeli używasz ten ciąg? Czy jest to zapytanie HTML, JavaScript lub częściowe zapytanie SQL? –

+0

Po prostu upewnij się, że nie ma przypadku, w którym użytkownik używa cudzysłowów w tekście, które następnie są przycinane, ale być może nie powinny. – markus

+0

AND: to jest cytat: '' '' - to podwójny cytat '" '- używasz tych terminów nieco błędnie – markus

Odpowiedz

10

Tak właśnie rozwiązam ten problem. Warto się tylko martwić, że kod jest powolny, jeśli masz problem z wolną aplikacją i możesz prześledzić to do instrukcji trim.

Dobrze znany cytat z programowania brzmi: "Premature Optimisation jest źródłem wszelkiego zła" - zobacz artykuł Wikipedii połączony w celu uzyskania dalszych informacji na ten temat.

+0

Dobry artykuł, ja ' Daję to przeczytać.Dziękuję – Rowan

2

Osobiście proponuję usunięcie cudzysłowów z danych wejściowych. Jeśli chcesz przyspieszyć wprowadzanie cudzysłowu, możesz zezwolić na wpisywanie lub zapisywanie cudzysłowów. Przed ich wyświetleniem zawsze będziesz musiał skorzystać z funkcji if/else.

Oczywiście, nadal trzeba wykonać kontrolę poprawności danych wejściowych, niezależnie od systemu, który skończy.

+0

dziękuję za odpowiedź, zgadzam się, ale system, nad którym pracuję został złożony częściowo przez kogoś innego, więc muszę pracować z okropnymi istniejącymi danymi .. W końcu zdezynfekuję to wszystko! – Rowan

0

Powszechną praktyką jest stosowanie cudzysłowu do reprezentowania cytatów w środki, jeśli chcesz, aby Twoi użytkownicy napisać:
i powiedziała: „hej ho”

, które można przekształcić:
Użytkownik: "i powiedziała:" hej ho ""

3

Należy dokładnie rozważyć, co powinno się stać z wszystkimi przypadkami. (używając [] jako cytatów dla czytelności)

Powiedziałeś, co robisz dla ["Cześć"], ale co robisz dla [mówiłem "Cześć", punk]? Czy nadal usuwasz dane wejściowe użytkownika lub usuwasz je? A może pójdź o krok dalej i zastąp pojedyncze cudzysłowy podwójnymi cudzysłowami ... ale wtedy musisz wziąć pod uwagę przypadki, w których dane wprowadzane przez użytkownika zawierają zarówno pojedyncze, jak i podwójne cudzysłowy! A co, gdy użytkownik wprowadzi "gramatyczny błąd", taki jak ["Witaj" (brak cytatu zamykającego!).

Najlepszym sposobem na zapewnienie właściwego postępowania jest wykonanie przypadku testowego dla każdego przypadku krawędzi, który można wymyślić i upewnij się, że proponowane rozwiązanie faktycznie spełnia to, czego się oczekuje.

Jeśli rzeczywistą przyczyną tego wymagania jest [Biorę użytkownika danych w pewnym momencie, a następnie ponownie wyświetla je do nich w innym miejscu, a nie chce pokazać im głupich danych, takich jak ["" danych ""]], prawdopodobnie będziesz chciał usunąć tylko podwójne cudzysłowy z początku lub końca ciągu wejściowego, ponieważ zdejmuje je ze środkowych śrub z danymi zamierzonymi przez użytkownika.

Jeśli Twoim celem jest jedynie wyraźne rozróżnienie ich danych wejściowych i tekstowych, które nie zostały wprowadzone, zastanów się nad użyciem innych sposobów wyróżnienia tego zamiast cudzysłowów. Dlatego zamiast [wprowadziłeś "dane"], możesz wyświetlić [wprowadziłeś danych] lub [wprowadziłeś: dane], które całkowicie pomijają ten problem.

+0

+1 dla testów przypadków użycia, dobry punkt, w którym wstydzę się przegapić w mojej własnej odpowiedzi ... = / –

0

zrobiłem to w ten sposób:

function quotize(&$string) 
{ 
    if (empty($string) || is_null($string)) { 
     return; 
    } 

    $char = '"'; 
    if ($string[0] != $char) { 
     $string = $char . $string; 
    } 

    if (substr($string, -1) != $char) { 
     $string .= $char; 
    } 

    return; 
} 
Powiązane problemy