preg_replace i zawiłości znaku nowej linii
cze 11
Programowanie PHP, regexp No Comments
Wczoraj miałem do podmiany część ciągu cyfr z dłuższego tekstu podobnego do tego, którego fragment poniżej, na inne znaki:
Jakistekst 1212121212121212 Cos: cos/cos
Zadanie wydawało się bardzo proste. Ciąg cyfr był zawsze w jednej linii. Chciałem użyć takiego oto kodu:
<?php
$ptn = "@\n[0-9]{12,19}\n@";
$result = preg_replace_callback(
$ptn,
create_function(
'$matches',
'return "\n&&&&".substr($matches[0], 5);'
) ,
$str, 1
);
?>
Okazało się, że wyrażenie regularne zwyczajnie nie działa, tak jak bym chciał w powyższym skrypcie. Testowanie wyrażenia regularnego na http://www.rexv.org/ pokazało, że działa ono bez problemu. Dlaczego?
Po dość długim czasie sprawdzania wszystkiego co mi przyszło do głowy, postanowiłem zbadać dokładnie co siedzi w linii z ciągiem cyfr. Okazało się, że nie wziałem pod uwagi faktu, że nowe linie mogą być sformatowane w „Windowsowy” sposób, a więc poprzez powrót karetki, a następnie znak nowej linii. Zatem moje wyrażenie regularne powinno wyglądać tak:
$ptn = "@\n[0-9]{12,19}\r\n@";
Najwyraźniej na http://www.rexv.org/ nie ma problemów z takimi niuansami i ich skrypty odpowiednio konwertują różne znaki nowej linii.
25 grudnia pojawiła się wersja finalna tego znakomita frameworka. Dużo ludzi włożyło dużo pracy, aby to wydarzenie mogło stać się faktem. 
Najnowsze komentarze