Разделить на [char], но не на [char] {2} через регулярное выражение

#php #regex #split

#php #регулярное выражение #разделить

Вопрос:

Мне нужно это сделать, в основном:

 Parameter    | Expected Result (array)
a            | [a]
a_b          | [a, b]
a_b_c        | [a, b, c]
a__b         | [a_b] <-- note that the double underline be unique
a_b__c       | [a, b_c]
  

Я знаю, как я это делаю с помощью методов explode и str_replace и с помощью foreach преобразования __ в _ . В основном это:

 <?php

    $parameter = 'a_b__c';

    $expected = str_replace( '__', "", $parameter ); # "a_bc"
    $expected = explode( '_', $expected );             # ["a", "bc"]

    foreach ( $expected as amp;$item )
        $item = str_replace( "", '_', $item );

    # ["a", "b_c"]

?>
  

Но я предполагаю, что с preg_* этим может быть быстрее. Или я ошибаюсь?

Что ж, я принимаю любое лучшее предложение. 🙂

Справка примечание: $parameter когда-либо будет идентификатором PHP (обычно идентификатором класса).

Ответ №1:

Вы можете попробовать следующий подход, используя preg_split:

 $result = preg_split("/(?<!_)_(?!_)/", $parameter);
  

?<! и ?! являются отрицательными утверждениями с нулевой шириной.

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

1. @David Rodrigues только что увидел, что вы также хотите ‘ _’ => » . Думаю об этом…

Ответ №2:

Я не думаю, что можно разделить и заменить в одной операции регулярного выражения. Допустим, вы ввели a_b__c. На первом шаге вы можете разделить, используя выражение (такое же, как то, что дал Говард)
$result = preg_split('/(?<!_)_(?!_)/', $subject); что дало [a, b__c] бы вам возможность теперь выполнять итерации по каждой записи в массиве и выполнять замену с помощью
$result = preg_replace('/_(?=_)/', '', $subject); что поможет вам заменить b__c на b_c .