Разделить на [char], но не на [char] {2} через регулярное выражение - PullRequest
0 голосов
/ 02 октября 2011

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

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( '__', "\0", $parameter ); # "a_b\0c"
    $expected = explode( '_', $expected );             # ["a", "b\0c"]

    foreach ( $expected as &$item )
        $item = str_replace( "\0", '_', $item );

    # ["a", "b_c"]

?>

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

Ну, я принимаю любое лучшее предложение.:)

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

Ответы [ 2 ]

2 голосов
/ 02 октября 2011

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

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

?<! и ?! - отрицательные значения нулевой ширины внешний вид утверждения.

1 голос
/ 02 октября 2011

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

...