2015-10-30 14 views
5

Próbuję uciec z ciągu znaków do użycia w wyrażeniu regularnym w PHP. Do tej pory próbowałem:Jak prawidłowo uciec ciąg znaków do wykorzystania w wyrażeniu regularnym w PHP?

preg_quote(addslashes($string)); 

myślałem muszę addslashes w celu właściwego uwzględnienia wszelkich cytatów, które w ciągu. Następnie preg_quote wymyka się ze znaków wyrażenia regularnego.

Problem polega jednak na tym, że cudzysłowy są ujęte z odwrotnym ukośnikiem, np. \'. Ale potem preg_quote wymyka się ukośnikowi wstecznemu z innym, np. \\'. Pozostaje więc to, że cytat ponownie się nie zmienia. Przełączanie tych dwóch funkcji również nie działa, ponieważ pozostawiłoby to ukośny ukośnik odwrotny, który jest następnie interpretowany jako specjalny znak wyrażeń regularnych.

Czy istnieje funkcja w PHP, aby wykonać zadanie? Albo jak by to zrobić?

+0

Gdzie jest Twoje wyrażenie regularne? Opublikuj to też –

+0

Och, myślałem, że problem jest niezależny od rzeczywistego wyrażenia regularnego, którego używam. W tej chwili próbuję użyć ''\ (? I) (? <=^| [^ A-z])'. Preg_quote (addslashes ($ string)). '\ I'' który nie działa. – Daniel

+4

Ograniczniki są nieprawidłowe, zamiast tego użyj ukośników lub tyld. 'addslashes' jest bezużyteczne. Użyj drugiego parametru "preg_quote". Zauważ, że '(? <=^| [^ A-z])' jest takie samo jak '(?

Odpowiedz

0

Właściwym sposobem jest użycie preg_quote i określenie używanego pattern delimiter.

preg_quote() wykonuje str i stawia przed ukośnik w każdej postaci, która jest częścią składni wyrażeń regularnych ... bohaterami są: . \ + * ? [^] $ () { } = ! < > | : -

Próba użycia ukośnika jako separatora jest kiepski pomysł. Zazwyczaj wybierasz postać, która nie jest używana we wzorze. Powszechnie stosowany jest ukośnik/pattern/, tyldy~pattern~, liczba znak#pattern# lub procent znak%pattern%. Możliwe jest również użycie ograniczników stylu nawiasów: (pattern)

Twoje wyrażenie z modyfikacją wymienioną w komentarzach @CasimiretHippolyte i @anubhava.

$pattern = '/(?<![a-z])' . preg_quote($string, "/") . '/i'; 

Może chciał użyć \bword boundary. Nie potrzeba żadnych dodatkowych ucieczek.

Powiązane problemy