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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

需要優(yōu)化:使用正則表達(dá)式使用可選且可重復(fù)的模式重新格式化字符串

需要優(yōu)化:使用正則表達(dá)式使用可選且可重復(fù)的模式重新格式化字符串

PHP
慕田峪4524236 2023-09-08 16:46:02
我想使用正則表達(dá)式重新格式化 PHP 中的字符串。該字符串可以如下所示:(例如)bj-11_2008-06_2015(F01,F02,F03,F04) bj-11_2008-06_2015(F01) bj-11_2008-06_2015(01) bj-11_2008-06_2015(3B) bj-11_2008-06_2015bj-11_2008讓我們看一下:第一部分是強(qiáng)制性的bj-11_2008,并且是bj固定的,11_2008可以是任何格式的日期MM_YYYY第二部分是可選的-06_2015,同樣應(yīng)該是MM_YYYY括號(hào)也是可選的(3B),但如果有的話,應(yīng)該至少包含一個(gè)條目,但最多包含 n 個(gè)條目。每個(gè)條目最多應(yīng)包含 4 個(gè)大寫字母和/或數(shù)字,并用“,”分隔,例如:(F01,F02,F03,F04)。然后一切都應(yīng)該像這樣重新格式化:被bj-刪除日期中的下劃線“_”替換為豎線“|”破折號(hào)“-”周圍有空格第二次日期后的空格用。。。來代替 ”;”輸出示例:11|2008 - 06|2015 (F01;F02;F03;F04)這是我已經(jīng)得到的:正則表達(dá)式:bj-([0-9]{2})_([0-9]{4})[-]*([0-9]{2})?_?([0-9]{4})?([(]([[:alnum:]]{0,4},?)*[)])?https://regex101.com/r/R7R3jC/1PHP:$regex = "/bj-([0-9]{2})_([0-9]{4})[-]*([0-9]{2})?_?([0-9]{4})?([(]([[:alnum:]]{0,4},?)*[)])?/";$teststrings=array(        "bj-11_2008-06_2015(F01,F02,F03,F04)",        "bj-11_2008-06_2015(F01)",        "bj-11_2008-06_2015(01)",        "bj-11_2008-06_2015(3B)",        "bj-11_2008-06_2015",        "bj-11_2008"    );foreach ($teststrings as $teststring) {    echo preg_replace_callback($regex, function($matches) {            $regexp2 = "/([[:alnum:]]{0,4},?)/";            $string ="";                        if (isset($matches[5])) {                $string = "(";                preg_match_all($regexp2, $matches[5], $inner_matches, PREG_SET_ORDER);                                foreach($inner_matches as $match){                    $string .= "$match[0]";                }                $string .= ")";                $string = str_replace(",",";",$string);            }                        if (isset($matches[4])){                echo "$matches[1]|$matches[2] - $matches[3]|$matches[4]" . " $string<br>";            }             else {                echo "$matches[1]|$matches[2]";            }        }    , $teststring);}http://sandbox.onlinephpfunctions.com/code/12b77482508f9d41e8b27a8c4df57bf47914155e這是可行的,但我認(rèn)為相對(duì)復(fù)雜,可能可以簡(jiǎn)化和優(yōu)化。但這是我用我對(duì)正則表達(dá)式非常有限的知識(shí)所能做出的全部,你能幫助我嗎?
查看完整描述

2 回答

?
largeQ

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊

由于您的原始字符串已經(jīng)格式化并且此格式是已知的,因此您無需使用正則表達(dá)式模式來探索它,您可以通過簡(jiǎn)單的替換來完成:


$s = <<<'EOD'

bj-11_2008-06_2015(F01,F02,F03,F04)

bj-11_2008-06_2015(F01)

bj-11_2008-06_2015(01)

bj-11_2008-06_2015(3B)

bj-11_2008-06_2015

bj-11_2008

EOD;


$trans = [ 'bj-' => '', '_' => '|', '-' => ' - ', '(' => ' (',

           ',' => ';' ];


echo strtr($s, $trans);


演示


查看完整回答
反對(duì) 回復(fù) 2023-09-08
?
慕桂英4014372

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊

沒有任何正則表達(dá)式,僅使用一些子字符串:


$input='bj-11_2008-06_2015(F01,F02,F03,F04)';


$s1=$s2=$s3='';


$sub = substr($input,3,7);                // => 11_2008

$s1 = str_replace('_','|',$sub);          // => 11|2008


$sub = substr($input,11,7);               // => 06_2015

if($sub !== false){

   $s2 = ' - '.str_replace('_','|',$sub); // => - 06|2015

   }


$sub = substr($input,18);                 // => (F01,F02,F03,F04)

if($sub !== false){

   $s3 = str_replace(',',';',$sub);       // =>  (F01;F02;F03;F04)

   }


$result = $s1.$s2.$s3;                    // => 11|2008 - 06|2015 (F01;F02;F03;F04)


查看完整回答
反對(duì) 回復(fù) 2023-09-08
  • 2 回答
  • 0 關(guān)注
  • 126 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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