2009
09.20

Problem występuje przy wklejeniu tekstu (np. kodu źródłowego) z edytora tekstowego do edytora w WordPress.

Skąd się bierze problem?
Otóż niektóre edytory tekstowe wstawiają dwa znaki jako znak nowego wiersza: LF (Line Feed) oraz CR (Carriage Return). Wbrew pozorom nie jest to wyssane z palca czy wymyślone bez powodu. Jest to pozostałość po maszynach do pisanie gdzie aby zacząć pisać od nowego wiersza trzeba było przeskoczyć o 1 linię w dół (LF) a następnie wrócić na początek wiersza (CR). Windows jako jeden z nielicznych systemów wraz ze swoim własnym „wspaniałym” kodowaniem znaków pozostał przy tym „genialnym” pomyśle i wstawia dwa znaki jako znak nowego wiersza. Przy wklejaniu takiego kodu do WordPress’a zamienia on na <br/> zarówno znak LF jak i CR. W efekcie otrzymujemy podwójne łamanie wierszy w poście.

Rozwiązanie?
Najlepszym rozwiązaniem było by pisanie tekstu w edytorze, który łamie wiersze tylko przy pomocy znaku LF. Jeżeli mamy już kod z obydwoma znakami jako enter polecam użyć edytora który pozwala zastępować znaki (również nowych linii) i usunąć wszystkie wystąpienia znaku CR. Otrzymany kod można spokojnie wkleić do edytora WordPress’a otrzymując pojedyncze <br/>.

Przykład?
Otwieramy plik przy pomocy edytora Vim.

vim /sciezka/do/pliku

Wciskamy <Shift>+: i wpisujemy polecenie:

:%s/\r//

Klikamy <Enter> i w ten sposób usuwamy każde wystąpienie znaku CR z pliku.
Wciskamy <Shift>+: i aby zapisać zmiany w pliku wpisujemy polecenie:

:wq
2009
09.20

Pewnie nie jedna osoba już się z tym męczyła i skończyła z funkcją usuwającą tylko wielokrotne spacje. Mi takie rozwiązanie nie pasowało. Potrzebowałem funkcji, która niezależnie od kodowania usunie z ciągu wszystkie powtarzające sie znaki. Przekopując internet wzdłuż i wszerz dogrzebałem się w końcu do pewnego artykułu opisującego możliwości wyrażeń regularnych w PHP. Otóż nawiasy okrągłe w wyrażeniach regularnych poza grupowaniem elementów tworzą tzw. referencję wsteczną (ang. backreference, o ile można to w ogóle przetłumaczyć). Referencje te można następnie „wywoływać” w dalszej części wyrażenia regularnego.

([a-c])x\1x\1

Powyższe wyrażenie pasuje zarówno do axaxa jak i bxbxb oraz cxcxc.
Dodatkowo referencję wsteczną możemy oznaczyć identyfikatorem (ang. named backreference). Identyfikator pozwala nam odwołać się do wybranej referencji przy pomocy nadanej nazwy, a nie liczb, które przy zmianie treści wyrażenia regularnego mogą stać się nieaktualne.

Poniższa funkcja pozwala na usunięcie wszystkich powtarzających się jeden po drugim znaków bądź jednego wybranego, powtarzającego się znaku.

function strip_multiplied_characters ($str,$character=null) {
/*
@author: Raisen
@site: http://www.raisen.pl/
@e-mail: kontakt[at]raisen[dot-here]pl
*/

    if (is_null($character) && is_string($str) && strlen($str)>0) {
        return preg_replace('/(?<znak>.)\k<znak>+/',"$1",$str);
    }

    if (is_string($character) && strlen($character)==1 && is_string($str) && strlen($str)>0) {
        return preg_replace('/(?<znak>'.$character.')\k<znak>+/',"$1",$str);
    }

    return false;
}
2009
09.20

Na początek

Chciałbym przywitać wszystkich czytelników tego bloga. Mam nadzieję, że informacje, które tutaj znajdziecie będą pomocne.

Zapraszam :)