通过正则表达式拆分[char]而不是[char]{2}


Split by [char] but not by [char]{2} via regex

我需要这样做,基本上:

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]

我知道如何使用explodestr_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标识符(通常是一个类标识符)

您可以使用preg_split:

尝试以下方法
$result = preg_split("/(?<!_)_(?!_)/", $parameter);

?<!?!是零宽负环视断言。

我认为在单个正则表达式操作中拆分和替换是不可能的。假设你输入了a_b__c。在第一步中,您可以使用表达式(与Howard给出的相同)进行分割
$result = preg_split('/(?<!_)_(?!_)/', $subject);会得到[a, b__c]现在您可以对数组中的每个条目进行迭代,并使用
$result = preg_replace('/_(?=_)/', '', $subject);进行替换,这将对您有所帮助将b__c替换为b_c