0

I have a string like:

'word1 \nword2 "word3 \nword4" word5 \nword6'

and I want to became like

'word1 
word2 "word3 \nword4" word5 
word6'

I couldn't write any success regexp pattern. Is this possible ?

tanaydin
  • 5,171
  • 28
  • 45

2 Answers2

0

You can use preg_split for this task:

$result = preg_split('/"[^"]*"(*SKIP)(*FAIL)|\s*\\n\s*/', $txt);

You obtain the parts you want in an array, you can make all what you want after. (write a file line by line, implode with a CRLF...)

More informations about (*SKIP) and (*FAIL): Verbs that act after backtracking and failure

Community
  • 1
  • 1
Casimir et Hippolyte
  • 88,009
  • 5
  • 94
  • 125
0

It's possible by regex, my way is kinda complex, maybe someone has better solution

$subject = <<<'SUBJECT'
'word1 \nword2 "special \n \"character" word5 \nword6'
SUBJECT;

$callback = function ($matches1) {
    if (preg_match_all(
<<<PATTERN
/"(?:\"|[^"])+?"/
PATTERN
        , $matches1[0], $matches2, PREG_OFFSET_CAPTURE)) {
        $pointer = 0;
        $arr = [];
        foreach ($matches2[0] as $match2) {
            $arr[] = substr($matches1[0], $pointer, $match2[1]);
            $arr[] = $match2[0];
            $pointer = $match2[1] + strlen($match2[0]);
        }
        $arr[] = substr($matches1[0], $pointer, strlen($matches1[0]));
        foreach ($arr as $key => &$value) {
            if (!($key % 2)) { 
                $value = preg_replace('/\Q\n\E/', "\n", $value); 
            }
        }
        return implode('', $arr);
    }
    return $matches1[0];
};
$result = preg_replace_callback(
<<<PATTERN
/'(?:\'|[^'])+?'/
PATTERN
, $callback, $subject);
file_put_contents('doc.txt', $result);
Eathen Nutt
  • 1,433
  • 5
  • 19
  • 27