#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
.