我需要这样做,基本上:
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标识符(通常是类标识符)。
答案 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
。