簡體   English   中英

如何用特定字母替換特定數字(在長度限制內)?

[英]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次的雙引號之間找到23

(?<=\\")[23]{1,7}(?=\\")

“ 233223322”不會替換為“ deededed”,因為它具有7個以上的字符(9)

演示版

說明

[23]{1,7} 23從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模式的改編。 他發布的模式並不能提供僅定位23所需要的准確性,而是提供任何非雙引號字符。 為了進行比較,我將使用~"([23]{1,7})"~ 這是一種非常整潔而有效的模式-沒有使用環顧四周,唯一的阻力是捕獲組。 此模式以可觀的142步評估字符串。

關於字符替換:

由於Stephane會將1到7個字符傳遞給匿名函數,並且switch情況僅檢查23精確匹配,因此他的答案是通過消除第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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM