Как заменить x в шаблоне на заданное число?

#php #regex #preg-replace

#php #регулярное выражение #preg-replace

Вопрос:

Что я еще не пробовал…

  <?

$dataArry = array (
"aab"=> array(
    "mobile"=>'123456789',
    "country"=>"Antigua and Barbuda",
    "countryCode"=>" 1-268",
    "pattern"=>"3#4",
    "pattern2"=>"(xx)-xxxxxxx"
)
);

$data = $dataArry["aab"]["mobile"];    //  number with leading 0...

if ($data[0] == "0" ) {  //remove the leading 0 from number...
    $data = substr($data, 1); 
}

$pattern = $dataArry["aab"]["pattern2"];
echo preg_replace("([x] )", $data, $pattern);

?>
  

Я получаю результат как (123456789)-123456789 но я хочу результат
как (12)-3456789

На самом деле, я хочу преобразовать все мобильные номера в числовой формат в соответствии с этой страной, поэтому я сохраняю шаблон со страной в своей базе данных. таким образом, я могу преобразовать их позже, когда мне нужно будет это отобразить…

ранее я использовал этот код, но он не стал более динамичным, потому что формат может быть таким (12) 44 33 222, or 12 44 33 22 . итак, я подумал о сохранении шаблонов типа (xx) xx xx xxx, xx xx xx xx xx и замене всех x числом. количество x всегда будет одинаковым для x в шаблоне.

 <?
$match = "";

$dataArry = array(
    "ind" => array(
        "mobile" => '07505942189',
        "country" => "india",
        "countryCode" => " 91",
        "pattern" => "3#3#4"
    ),
    "us" => array(
        "mobile" => '3784001234',
        "country" => "US",
        "countryCode" => " 1",
        "pattern" => "3#3#4"
    ),
    "aab" => array(
        "mobile" => '4641234',
        "country" => "Antigua and Barbuda",
        "countryCode" => " 1-268",
        "pattern" => "3#4"
    ),
    "afg" => array(
        "mobile" => '0201234567',
        "country" => "Afghanistan",
        "countryCode" => " 93",
        "pattern" => "2#7"
    )
);
$result .= $dataArry["afg"]["countryCode"] . " ";
$data = $dataArry["afg"]["mobile"]; // indian number with leading 0...
if ($data[0] == "0") { //remove the leading 0 from number...
    $data = substr($data, 1);
}


$string = $dataArry["afg"]["pattern"]; // pattern code 

$string = explode("#", $string); //making array of string pattern code.

foreach ($string as $vals) {
    $match .= "(d{" . $vals . "})";
}

//if(  preg_match( '/^ d(d{3})(d{3})(d{4})$/', $data,  $matches ) )
if (preg_match("/" . $match . "/", $data, $matches)) {
    for ($i = 1; $i < count($matches); $i  ) {
        if ($i == 1) {
            $result .= "(";
        }
        $result .= $matches[$i];
        if ($i == 1) {
            $result .= ")";
        }

        if ($i < count($matches) - 1) {
            $result .= "-";
        }



    }
    echo $result;
}


//research https://en.wikipedia.org/wiki/List_of_mobile_telephone_prefixes_by_country
//research http://www.onesimcard.com/how-to-dial/

?>
  

Комментарии:

1. Я не вижу начального нуля в вашем примере номера мобильного телефона. Может быть, вам следует рассказать нам, чего вы пытаетесь достичь здесь в целом. Это (12) код страны или префикс? Что произойдет с номерами из других стран?

2. @TimBiegeleisen хорошо, я собираюсь отредактировать и дам больше объяснений…

3. Обратите внимание, что удобнее использовать разделители регулярных выражений, не состоящие из пары, например "/x /" .

4. @TimBiegeleisen теперь это более понятно?

5. Какой длины могут быть эти числа?

Ответ №1:

Вы можете использовать preg_replace_callback для выполнения этого:

 $mobile = '123456789';
$pattern = '(xx)-xxxxxxx';

echo preg_replace_callback('/x /', function ($match) use (amp;$mobile) {
    $length = strlen($match[0]);

    $replacement = substr($mobile, 0, $length);

    $mobile = substr($mobile, $length);

    return $replacement;
}, $pattern);
  

https://3v4l.org/9QCD6

Комментарии:

1. хорошая работа, будет ли это работать для всех шаблонов, таких как xxx xxx xxxx? число x всегда будет одинаковым с количеством цифр, но шаблон может отличаться… Спасибо