2012-01-05 22 views
7

lo siguiente es parte de myfunction que abre un archivo y coloca el puntero al final. A continuación, prueba cada carácter $char en orden inverso hasta que encuentra una línea nueva o un carácter de retorno de carro.Detectar un carácter de nueva línea

El problema es que no reconoce estos caracteres.

La función es la siguiente:

while(count($results) < $limit && fseek($this->_pointer, $offset, SEEK_END) >= 0) { 
    $char = fgetc($this->_pointer); 
    if($char == '\n' || $char == '\r'){ 
     print("YAY"); 
     $offset --; 
     $data = $this->explodeData(fgets($this->_pointer, 1024)); 
     array_push($results, $this->formatRow($data)); 
    } 
    $offset--; 
} 

Nunca se las arregla para print("YAY") sin embargo se está probando con éxito cada carácter. El archivo que está leyendo definitivamente tiene nuevas líneas en él. (El archivo fue creado por otra función y ha tenido "\n" inserta en ella, se trata de mostrar en su interior y está mostrando en mi IDE con éxito como estar en líneas alternas).

¿Alguien sabe por qué no puede reconocer estos caracteres de nueva línea?

+0

Este procedimiento parece exagerado un poco ... ¿Cuál es el objetivo de este procedimiento? Si desea extraer una de las últimas líneas, sería mejor que use "file()" y obtenga las últimas entradas en la matriz. –

+0

¿Se considera "\ n" un personaje o dos caracteres? Está compuesto por dos caracteres ('\' y 'n'), de modo que ¿tu secuencia de comandos no fallaría si solo revisas un carácter a la vez? –

+1

@ RunarJørgensen '" \ n "' se convierte en un carácter de nueva línea –

Respuesta

10

Está utilizando '\n' en lugar de "\n".

while(count($results) < $limit && fseek($this->_pointer, $offset, SEEK_END) >= 0) { 
    $char = fgetc($this->_pointer); 
    if($char == "\n" || $char == "\r"){ 
     print("YAY"); 
     $offset --; 
     $data = $this->explodeData(fgets($this->_pointer, 1024)); 
     array_push($results, $this->formatRow($data)); 
    } 
    $offset--; 
} 

"\n" == LF character 
'\n' == '\n'; 

// Variables are effected also 
$var = 'foo'; 

print "$var"; // prints 'foo'; 
print '$var'; // prints '$var'; 
+0

Duh, gracias :). Estúpidamente olvidado esto antes y sustituye toda '" 'con ''' con una búsqueda y reemplazo para ser consistente Apuesto a que hay un montón de ocurrencias –

2

uso de comillas dobles en lugar de comillas simples alrededor del "\ n" y "\ r"

tuve una pesadilla similar hace un tiempo, hasta que me di cuenta de que php no utiliza caracteres de escape a menos que están entre comillas dobles

14

Para que su plataforma de código agnóstico que es mejor tener su condición si de esta manera:

if($char == PHP_EOL) { 
    print("YAY"); 
    // your rest of the code 
} 

Gracias a @ comentario Félix Gagnon-Grenier a continuación.

PHP_EOL podría no funcionar en cadenas que provienen de otros sistemas. PHP_EOL representa el carácter de línea final para el sistema actual.

Para que sea detectar todo tipo de caracteres de nueva línea incluyendo saltos de línea Unicode utilizar \R:

preg_match('/\R/', $str); 

\R es equivalente a (?>\r\n|\n|\r|\f|\x0b|\x85|\x{2028}|\x{2029})

Code Demo

+1

cuidadosa:.. Aunque esto sea útil, puede que no funcione en las cuerdas que vienen de otra los sistemas. PHP_EOL representa el carácter de línea de fondo para el sistema actual (por ejemplo, \ n en sistemas Unix) sin embargo, si usted está tratando cuerdas de un sistema Windoes (\ r \ n) que no serán rexognised como líneas de fondo.PHP_EOL es "[El símbolo correcto de 'Final de línea' para esta plataforma] (http://php.net/manual/en/reserved.constants.php)". Por cierto, esto no será cierto para las tres terminaciones de línea, puede ver [aquí] (https://eval.in/959046). –

Cuestiones relacionadas