PHP удалить разрыв строки или CR LF безуспешно - PullRequest
12 голосов
/ 04 марта 2012

Я сделал функцию удаления разрыва строки с помощью php, но безуспешно, я попробовал все заменить код, и я все еще получаю этот разрыв строки, я создаю файл json и не могу прочитать его из jsonp с помощью jquery из-за этих строкперерыв, кажется, ломает все это.

function clean($text)
{
$text = trim( preg_replace( '/\s+/', ' ', $text ) );  
$text = preg_replace("/(\r\n|\n|\r|\t)/i", '', $text);
return $text;
}

Когда я смотрю на источник, появляется какой-то разрыв строки во всех href, img и br, это пример вывода json_encode:

<a
href=\"http:\/\/example.com\/out\/content\/\" title=\"link to content website\">

разрыв строки после a.это возможно для img src и br

единственный способ, которым я могу удалить их, разбить его с помощью

$text = preg_replace("/\s/i", '', $text);

Но вы понимаете, что во всей строке не осталось места, и это не то, что мы хотим.

Ответы [ 9 ]

27 голосов
/ 05 марта 2012

эта замена лучше работает для меня:

= str_replace (array("\r\n", "\n", "\r"), ' ', $text)
1 голос
/ 23 декабря 2018

Попробуйте использовать функцию обрезки по умолчанию с "character_mask".

Например:

$text = trim($text, " \t\n\r\0\x0B"); 

Прочтите официальную документацию http://php.net/manual/ru/function.trim.php

1 голос
/ 15 февраля 2016

Как насчет следующего

function clean($text)
{
    return trim(preg_replace("/(\s*[\r\n]+\s*|\s+)/", ' ', $text));
}

первая часть \s*[\r\n]+\s* заменит любые разрывы строк, начальные и конечные пробелы в одном пробеле.

вторая часть \s+ сократит пробелы в один пробел.

затем trim() удаляет начальное / хвостовое пространство.

1 голос
/ 05 марта 2012

Как насчет этого:

function clean($text)
{
    $parts = explode(' ', $text);
    foreach ($parts as $key => $value)
        $parts[$key] = preg_replace('/\s/', ' ', $value);
    return implode(' ', $parts);
}

Действительно, если вместо очистки файла JSON, подобного этому, вы можете использовать json_encode для его создания, вы избавитесь от этой проблемы на предыдущем шаге.

0 голосов
/ 01 августа 2017

Если вы хотите удалить CR и оставить LF, это действительно очень просто (просто здравый смысл):

$text = str_replace("\r", "", $text);
0 голосов
/ 01 октября 2016
function clean($text)
{
    return trim(preg_replace('/\\\\r|\\\\n|\\\\t/i', ' ', $text));
}

Работает нормально.

0 голосов
/ 05 марта 2012

Я использую метод echo str_replace(array('\r\n', '\r', '\n', '\t'), array('\\r\\n', '\\r', '\\n', '\\t'), $text);

То, что это делает, позволяет вам видеть, какие символы вызывают разрывы в тексте, и заменять их соответствующим образом. Например, если у вас есть «\ n» разрыв текста, когда вы используете этот код, он будет отображать «\ n» на своем месте. Пример:

<a
href=\"http:\/\/example.com\/out\/content\/\" title=\"link to content website\">

станет:

<a\n href=\"http:\/\/example.com\/out\/content\/\" title=\"link to content website\">

Естественно, существует большое количество других ломающих символов, которые можно использовать, но \ r \ n, \ r, \ n и \ t являются наиболее часто используемыми.

0 голосов
/ 05 марта 2012

Может быть, вы можете попробовать пройти текстовый символ за символом и вызвать ord() для каждого, чтобы вы могли увидеть, действительно ли эти символы разрыва \r,\n s?

Недавно у меня возникла аналогичная проблема сПробел, который оказался неразрывным пробелом даже внутри таблицы ASCII (код 194 или что-то в этом роде).

Если вас заинтересовало, мое решение было не пытаться фильтровать разрывы, а фильтровать ВСЕ, кромечто должно было быть в тексте, примерно так:

$text = preg_replace("/[^ \na-zа-я0-9`~\!@#\$%\^&\*\(\)_\+\-\=\[\]\{\}\\\|;\:'\",\.\/\<\>\?]+/ui", "", $text);
0 голосов
/ 04 марта 2012

используйте json_encode () и json_decode () из расширения JSON для обработки задач де-сериализации JSON:

$myobj = array( 'foo' => 'bar', 'foz' => 'baz')

$json_myobj = json_encode($myobj);
echo $json_myobj;

$myobj = json_decode($json_myobj);
print_r($myobj);
...