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:
[plain]
Jakistekst
1212121212121212
Cos: cos/cos
[/plain]
Zadanie wydawało się bardzo proste. Ciąg cyfr był zawsze w jednej linii. Chciałem użyć takiego oto kodu:
1 2 3 4 5 6 7 8 9 10 11 12 |
< ?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:
1 |
$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.