第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用新行替換 \n

用新行替換 \n

PHP
青春有我 2023-03-04 17:32:10
我有一個由文本組成的字符串,可以包含多個\和n。在 php 中,使用 preg_replace,我只想在需要的地方\n替換[NewLine]。說替換\n我的意思是替換字符反斜杠-n(\和n)。我瀏覽了類似的問題,但沒有找到一個來處理\\n不應(yīng)該用新行替換的情況。例如,字符串hello\nworld應(yīng)該是hello[NewLine]world,并且字符串hello\\nworld應(yīng)該是hello\nworld.意義 :<?php$source1 = <<<'EOD'\nEOD;$source2 = <<<'EOD'\\nEOD;$source3 = <<<'EOD'\\\nEOD;//$source4 with 4 backslaskes , 5 with 5 etc.//preg_replace `$source1` so it ends up as `[NewLine]`//preg_replace `$source2` to `\\n`//preg_replace `$source3` to `\\[NewLine]`//etc//....//even number of consecutive \ followed by n means no [NewLine]//odd number of consecutive \ followed by n means new [NewLine]我有一個錯誤的替換代碼$a = preg_replace('{([^{\\\}])\\\n}', "$1\n", $string); //work as expected when $string is "first-line\\nsecond-line";//doesn't work as expected when $string is "first-line\\\nsecond-line";任何人都知道在正則表達(dá)式中需要做什么才能使它正常工作?
查看完整描述

3 回答

?
蠱毒傳說

TA貢獻1895條經(jīng)驗 獲得超3個贊

您可以使用回溯控制動詞 跳過部分字符串(*SKIP)

$result = preg_replace('~\\\\.(*SKIP)(?<=n)~', "\n", $source);

演示

(*SKIP)當(dāng)它之后的子模式失敗時,跳過它之前的子模式已經(jīng)到達(dá)的字符串的位置。
(?<=n)是一個回顧斷言,意思是前面有 n。當(dāng)它失敗時,正則表達(dá)式引擎跳轉(zhuǎn)到轉(zhuǎn)義字符位置(由 定義的位置(*SKIP))之后進行新的嘗試,而不是測試下一個位置(反斜杠之后的位置)。


您也可以使用以下方法執(zhí)行相同的操作strtr

$result = strtr($source, ['\\\\' => '\\\\', '\\n' => "\n"]);

(由于為兩個連續(xù)的反斜杠定義了替換,因此第二個反斜杠不能用于最終的后續(xù)n.)


查看完整回答
反對 回復(fù) 2023-03-04
?
萬千封印

TA貢獻1891條經(jīng)驗 獲得超3個贊

您需要匹配成對的反斜杠\\或成對的\n. 通過指定回調(diào),您可以檢查是否需要替換它,如果不需要,只需逐字返回匹配的字符:


<?php


$inputs = [

    "\n is [NewLine]",

    "\\n is \n",

    "\\\n is \[NewLine]",

    "\n and \\n and \\\n and \\\\n"

];


$nl = function($matches) {

    return $matches[0] == "\n" ? "[NewLine]" : $matches[0];

};


print_r(preg_replace_callback("/\\\\|\\n/", $nl, $inputs));

通過將\\first 放在正則表達(dá)式交替中,它將首先被消耗,并且只有當(dāng)反斜杠的數(shù)量為奇數(shù)時,才會\n匹配。


(確保轉(zhuǎn)義正則表達(dá)式模式中的反斜杠?。?/p>


最后一個示例輸入的輸出:[NewLine] and \n and \[NewLine] and \\n


如果您的輸入包含文字反斜杠字符和n(0x5c 0x6e) 而不是換行符 (0x0a)——那么您的輸入是真的\\n而不是\n——您需要添加一個額外的轉(zhuǎn)義級別。正則表達(dá)式變?yōu)?\\\\\\\\|\\\\n/回調(diào)必須檢查"\\n"


查看完整回答
反對 回復(fù) 2023-03-04
?
慕妹3146593

TA貢獻1820條經(jīng)驗 獲得超9個贊

找到了一個更簡單的解決方案。就像 knittl 所說的那樣,對匹配\是關(guān)鍵,而 regxp 并不是真正需要的。


strtr($input, ['\\\\' => '\\','\\n' => "[NL]"]);

在https://3v4l.org/5tebZ測試



$um = [

        '\\\\' => '\\',

        '\\n' => "[NL]",

    ];


$inputs = [];

for ($i=1;$i<=14;$i++) {

   $inputs[] = ''.str_repeat("\\", $i)."n";

}


foreach ($inputs as $input) {

    $results[] = strtr($input, $um);

}


foreach ($inputs as $key=>$value)

{

    echo str_pad($value, 15, ' ',STR_PAD_LEFT)." =======> ".$results[$key]."\n";

}

輸出


             \n =======> [NL]

            \\n =======> \n

           \\\n =======> \[NL]

          \\\\n =======> \\n

         \\\\\n =======> \\[NL]

        \\\\\\n =======> \\\n

       \\\\\\\n =======> \\\[NL]

      \\\\\\\\n =======> \\\\n

     \\\\\\\\\n =======> \\\\[NL]

    \\\\\\\\\\n =======> \\\\\n

   \\\\\\\\\\\n =======> \\\\\[NL]

  \\\\\\\\\\\\n =======> \\\\\\n

 \\\\\\\\\\\\\n =======> \\\\\\[NL]

\\\\\\\\\\\\\\n =======> \\\\\\\n


查看完整回答
反對 回復(fù) 2023-03-04
  • 3 回答
  • 0 關(guān)注
  • 164 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號