Jedna z linii mojego skryptu zawiera tag zamykający PHP wewnątrz ciągu. Podczas normalnej pracy nie powoduje to problemu, ale muszę zakomentować linię.
Próbowałem skomentować tę linię //
, /*
*/
a #
jednak żaden z nich nie działa, parser rozważa zamknięcie tag być rzeczywisty znacznik zamykający.
Oto omawiany wiersz:
$string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i', '<br />', $string);
// ^^ ^^
Co mogę zrobić, aby zakomentować powyższą linię?
<?php # echo 'simple';?>
.Odpowiedzi:
Użyj sztuczki: połącz strunę z dwóch kawałków. W ten sposób tag zamykający jest przecinany na pół i nie jest już prawidłowym tagiem zamykającym.
'?>' --> '?'.'>'
W swoim kodzie:
Dzięki temu
//
komentarze będą działać.Aby
/* */
komentarze działały, musiałbyś również podzielić*/
sekwencję:Pamiętaj, czasami, mimo że całość to coś więcej niż suma jej części - ale bycie chciwym jest złe, są chwile, gdy lepiej zostawić ci mniej . :)
źródło
??<
Najłatwiejszy sposób
Utwórz oddzielną zmienną do przechowywania wyrażenia regularnego; w ten sposób możesz po prostu skomentować
preg_replace()
oświadczenie:Napraw za pomocą klas postaci
Aby naprawić komentarze do linii, możesz przerwać,
?>
umieszczając>
wewnątrz klasy znaków, jak na przykład:Aby naprawić komentarze blokowe, możesz zastosować je do
/
:Aby naprawić oba style komentarzy, możesz wstawić
/
i>
do ich własnej klasy znaków.Napraw za pomocą
/x
modyfikatorax
Modyfikator - akaPCRE_EXTENDED
- ignoruje spacje i znaki nowej linii w wyrażeniach regularnych (z wyjątkiem, gdy występują one w środku klasy postaci); umożliwia to dodanie spacji w celu oddzielenia problematycznych znaków. Aby naprawić oba style komentarzy:źródło
x
modyfikatora :)g
) ...Dlaczego twoje próby się nie powiodły:
Co działa:
Dalej...
Po powyższym powinieneś móc użyć
/*
do zakomentowania linii. Jeśli zostawisz to?>
nietknięte,//
nie możesz wykomentować całej linii. Poniższy tekst?>
może być html, który jest poza kontrolą interpretera PHP, więc to nie zadziała.Z dokumentacji:
źródło
Inny pomysł: Escape the
>
(i/
, jeśli chcesz użyć/*...*/
komentarza):Silnik wyrażeń regularnych ignoruje „niepotrzebne” zmiany znaczenia, ale jest w tym przypadku przydatne (z powodów przedstawionych w innych odpowiedziach).
źródło
Po co używać skomplikowanych, trudnych do odczytania „sztuczek”, aby obejść problem?
?
jest tylko wygodnym skrótem do kwantyfikatora, więcPo prostu użyj długiej wersji kwantyfikatora
{0,1}
, czyli „minimum 0, maksimum 1 wystąpienie”:źródło
Kilka innych sposobów, które warto dodać do książki trików RegEx :
Najpierw możesz skompaktować wyrażenie regularne do:
/(<br\s*/?>)+/i
i zamienić na<br />
wyrażenie regularne (nie ma potrzeby obciążania wyrażenia regularnego z wyprzedzeniem), a zawsze otrzymasz wybrany podział wiersza XHMTL.Inne sposoby modyfikowania wyrażenia regularnego, aby nie wyłączało
*/
komentarza lub?>
skryptu:#(<br\s*+/?+>)+#i
- co w zasadzie oznacza, że\s*+
jeśli znalazłeś tyle białych znaków, ile jest i zachowasz je, a/?+
jeśli znalazłeś ukośnik, zachowaj go!\s*
i/*
w grupach przechwytywania =>#(<br(\s*)(/?)>)+#i
Dema na żywo: http://codepad.viper-7.com/YjqUbi
A ponieważ oparliśmy się na zachowaniu zaborczym, najszybszym wyrażeniem regularnym, które również omija problem komentowania, jest: wyjaśnione demo
#(<br\s*+/?+>)++#i
Co do komentowania w trudnych sytuacjach
Kiedy nie możesz zmienić kodu lub użyłeś już komentarza wielowierszowego i:
1. Skorzystaj z nowdoc :
Kod na żywo: http://codepad.viper-7.com/22uOtV
Uwaga: nowdoc jest podobny do heredoc, ale nie analizuje treści i musi mieć swój początkowy ogranicznik ujęty w
'
pojedyncze cudzysłowy'
( pamiętaj, że ogranicznika końcowego nie można zidentyfikować , musi po nim następować;
i nowa linia ! )2. Przeskocz kod za pomocą goto :
Przykład na żywo: http://codepad.viper-7.com/UfqrIQ
3. Przeskocz nad kodem za pomocą
if(false)
lubif(0)
:Test: http://codepad.viper-7.com/wDg5H5
źródło