[英]How to limit the letter count and accept only specific letters in PHP STDIN?
[英]How to replace specific numbers (within a length limit) with specific letters?
我正在嘗試使用preg_replace
將數字更改為字母,但僅將數字包裝在""
並且子字符串中的字符數不得超過7個。
輸入字符串示例:
"3"sca"""co"1"str"0"ctor""r"3"t"0"r"1""locat"5"o"133""0"27""754a49b393c2a0"33"b97"332"cb7"3"c3c07"2""co"1"str"0"ctor""r"3"t"0"
期望的效果是每個合格2
變為d
,每個合格3
變為e
。
這些是正確替換的示例:
"3"
變成e
"23"
變成de
"33"
成為ee
"32"
變成de
"333223"
成為eeedde
我的編碼嘗試:
$string = preg_replace("/\"322\"+/", "edd", $string);
$string = preg_replace("/\"233\"+/", "dee", $string);
$string = preg_replace("/\"32\"+/", "ed", $string);
$string = preg_replace("/\"23\"+/", "de", $string);
$string = preg_replace("/\"33\"+/", "e", $string);
$string = preg_replace("/\"333\"+/", "e", $string);
$string = preg_replace("/\"3\"+/", "e", $string);
$string = preg_replace("/\"3\"+/", "e", $string);
$string = preg_replace("/\"3\"+/", "e", $string);
$string = preg_replace("/\"3\"+/", "e", $string);
$string = preg_replace("/\"3\"+/", "e", $string);
如何通過一次preg_replace調用進行所有合格替換?
要只替換引號內的2和3,可以執行preg_replace_callback()
來完成。
$before = '754a49b393c2a0"33"b97"332"cb7"3"c3c07"2"';
$after = preg_replace_callback(
'/"([^"]+)"/',
function ($matches) {
return str_replace( array( '2', '3' ), array( 'd', 'e' ), $matches[1] );;
},
$before
);
echo $after;
使用此正則表達式可在1到7次的雙引號之間找到2
或3
(?<=\\")[23]{1,7}(?=\\")
“ 233223322”不會替換為“ deededed”,因為它具有7個以上的字符(9)
說明
[23]{1,7}
2
或3
從1到7次
(?<=\\")
前面加雙引號
(?=\\")
后跟雙引號
片段
$text = '"3"sca"""co"1"str"0"ctor""r"3"t"0"r"1""locat"5"o"133""0"27""754a49b393c2a0"33"b97"332"cb7"3"c3c07"2""co"1"str"0"ct"233223322"or""r"3"t"0"';
$regex = '/(?<=\")[23]{1,7}(?=\")/';
$text = preg_replace_callback($regex,
function ($m) {
switch ($m[0]) {
case '2': return 'd';
case '3': return 'e';
// Add other cases here ...
}
},
$text
);
echo $text;
首先,我建議的代碼。 然后回顧此頁面上使用的技術。
代碼:( 演示 )
echo preg_replace_callback('/"([23]{1,7})"/',
function ($m) {
return str_replace(['2', '3'], ['d', 'e'], $m[1]);
},
$text
);
Stephane Janicaud和BA_Webimax的preg_replace_callback()
答案在執行過程中具有很好的組件,但不是很好,但是總的邏輯是合理的。 我將花一些時間隔離一些弱點/機會並提供一些改進。
Stephane的模式: /(?<=\\")[23]{1,7}(?=\\")/
誤解了問題,並將雙引號留在了輸入字符串中。 他編寫了最合適的字符類和量詞表達式(一到七次出現),但是環顧四周給模式效率帶來了不必要的沉重負擔。 同樣,雙引號前的反斜杠也是不必要的。 此模式以高達407個步驟的方式評估OP的輸入字符串。
接下來的是BA_Webimax模式的改編。 他發布的模式並不能提供僅定位2
和3
所需要的准確性,而是提供任何非雙引號字符。 為了進行比較,我將使用~"([23]{1,7})"~
。 這是一種非常整潔而有效的模式-沒有使用環顧四周,唯一的阻力是捕獲組。 此模式以可觀的142步評估字符串。
由於Stephane會將1到7個字符傳遞給匿名函數,並且switch
情況僅檢查2
或3
精確匹配,因此他的答案是通過消除第3和第4個匹配來破壞字符串。 這使答案簡直是錯誤的。 (“ Add other cases
注釋對於開發人員來說不是合理的“ yatta yatta
”,為什么要這么做?)
BA_Webimax使用str_replace()
對第一個捕獲組字符串執行智能,直接,有效的操作。
我檢查了3v4l.org上的性能速度,並使用輸入字符串在php7.2上的str_replace()
淘汰了strtr()
。 也就是說,執行真實的基准測試會涉及大量輸入數據-我只是沒有走這條路。
單功能替換:
str_replace(['2', '3'], ['d', 'e'], $m[1]);
strtr($m[1], ['2' => 'd', '3' => 'e']);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.