regex, powtórzenia

0

Niech mi to ktoś k... wyjaśni, bo zaraz mnie coś trafi:

$parametry_urla = "usun_logi¦logi_systemowe¦potwierdz¦ aa¦¦";
$parametry_urla   = preg_replace("/[¦]{2,}/", "#", $parametry_urla);
echo("$parametry_urla");

usun_logi#logi_systemowe#potwierdz# aa#

$parametry_urla = "usun_logi¦logi_systemowe¦potwierdz¦ aa¦¦";
$parametry_urla   = preg_replace("/[¦]{3,}/", "#", $parametry_urla);
echo("$parametry_urla");

usun_logi¦logi_systemowe¦potwierdz¦ aa#

Dlaczego liczy o jedno powtórzenie mniej niż zadeklarowano w nawiasach?

p.s. No dorba, piłam. Dwa piwa 0.4l.

2

No i już wiem. P... unicode obsługiwane na doczepkę.

Trzeba dodać flagę /u.

$parametry_urla   = preg_replace("/¦{2,}/u", "#", $parametry_urla);
$parametry_urla   = preg_replace("/¦{3,}/u", "#", $parametry_urla);
2

Obstawiam, że jakiś fuckup z kodowaniem. Ten dziwny znaczek składa się z dwóch bajtów w UTF-8. Osadziłaś go w nawiasach kwadratowych, więc zakładając, że to to coś traktuje to jako ISO to zadeklarowałaś klasę składającą się z dwóch znaków i chcesz przynajmniej dwóch następujących po sobie wystąpień. W efekcie każde wystąpienie znaku ¦ pasuje do tego wzorca.

W drugim przypadku tylko na końcu masz cztery te znaczki. Czyli cztery bajty należące do klasy znaków. Czyli więcej niż 3 i pasuje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1