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

时间:2011-10-02 14:11:22

标签: php regex split

我需要这样做,基本上:

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标识符(通常是类标识符)。

2 个答案:

答案 0 :(得分:2)

您可以使用preg_split尝试以下方法:

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

?<!?!是零宽度否定lookaround断言。

答案 1 :(得分:1)

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