2012-03-13 16 views
7

Chcę dopasować wielbłądowe wyrazy zaczynające się od !, takie jak zawarte w $line. Używam php 5.3.10-1ubuntu2 with Suhosin-Patch (cli).Jak dopasować wykrzyknik (!) W PHP?

Próbuję następujące rzeczy:

  • $line = preg_replace(" !([A-Z])", " $1", $line);
    • wynik: PHP Warning: preg_replace(): No ending delimiter '!' found
  • $line = preg_replace(" \!([A-Z])", " $1", $line);
    • wynik: PHP Warning: preg_replace(): Delimiter must not be alphanumeric or backslash
  • $line = preg_replace(" [!]([A-Z])", " $1", $line);
    • wynik: PHP Warning: preg_replace(): Unknown modifier '('
  • $line = preg_replace(" [\!]([A-Z])", " $1", $line);
    • wynik: PHP Warning: preg_replace(): Unknown modifier '('

jaki jest prawidłowy sposób dopasować ! w PHP regexp?

Odpowiedz

6

Trzeba użyć ograniczników w Twojej regex - niealfanumeryczne, jak stwierdza komunikat o błędzie:

$line = preg_replace("/ !([A-Z])/", " $1", $line); 

zauważy / znaki na początku i na końcu łańcucha regex.

Te nie muszą być / - można użyć # lub nawet ! - ale jeśli używasz ! następnie trzeba uciec ! char wewnątrz samego regex.

+0

Nie musisz uciekać z '!' –

+0

@BartKiers Tak, wiem - właśnie skopiowałem losową jedną z jego opcji - okazało się być drugą. Zaktualizowałem teraz odpowiedź. –

+0

@OP pamiętaj, że aby korzystać z funkcji wyrażeń regularnych php, musisz zawrzeć wyrażenie za pomocą "losowego" (samodzielnie wybranego) ogranicznika. Może to być/(jak w przykładzie), ale także &, * lub cokolwiek innego. Ale prawie każdy przykład znaleziony w Internecie pomija te załączniki (co jest poprawne), więc nie zapomnij o nich :) – giorgio

-1

Spróbuj tego:

!\b([A-Z][a-z]*){2,}\b 

Live Preview: http://regexr.com?30a95 (sprawdź globalny i multiline).

+1

granica słowa w '!\ b [A-Z] 'można po prostu pominąć: zawsze jest' \ b' między '!' a literą. Problemem OP są ograniczniki, o których Aleks już wspomniał w swojej odpowiedzi. –