Как разделить строку на запятую, за которой НЕ следует пробел?

#php #regex #preg-split

#php #регулярное выражение #preg-split

Вопрос:

Я хочу, чтобы результаты были:

 Cats, Felines amp; Cougars    
Dogs    
Snakes
 

Это самое близкое, что я могу получить.

 $string = "Cats, Felines amp; Cougars,Dogs,Snakes";
$result = split(',[^ ]', $string);
print_r($result);
 

Что приводит к

 Array
(
    [0] => Cats, Felines amp; Cougars
    [1] => ogs
    [2] => nakes
)
 

Комментарии:

1. Используется s для сопоставления пробелов

Ответ №1:

Для достижения этой цели вы можете использовать отрицательный прогноз:

 ,(?!s)
 

На простом английском языке приведенное выше регулярное выражение говорит, что все запятые совпадают, только если за ним не следует пробел ( s ) .

В PHP вы можете использовать его с preg_split() , например, так:

 $string = "Cats, Felines amp; Cougars,Dogs,Snakes";
$result = preg_split('/,(?!s)/', $string);
print_r($result);
 

Вывод:

 Array
(
    [0] => Cats, Felines amp; Cougars
    [1] => Dogs
    [2] => Snakes
)
 

Комментарии:

1.@JayDansand: На самом деле это привело Test, Example бы к.

2. Ага, ты прав, это то, что я получаю за просмотр. Отозвано!

3. @JayDansand: Хотя я не уверен, ожидает ли это OP в качестве вывода. Думаю, я просто оставлю ответ таким, какой он есть. Кстати, спасибо 🙂

Ответ №2:

функция split() устарела, поэтому вместо нее я использую preg_split .

Вот что вы хотите:

 $string = "Cats, Felines amp; Cougars,Dogs,Snakes";
$result = preg_split('/,(?! )/', $string);
print_r($result);
 

Это использует ?! чтобы показать, что мы хотим разделить на запятую только тогда, когда за ней не следует сгруппированная последовательность.

Я связал документацию Perl по оператору, поскольку preg_split использует регулярные выражения Perl:

http://perldoc.perl.org/perlre.html#Look-Around-Assertions

Комментарии:

1. Спасибо, я думаю, что это самый чистый синтаксис

Ответ №3:

Если вы хотите разделить на символ, но хотите игнорировать этот символ в случае его экранирования, используйте утверждение lookbehind .

В этом примере строка будет разделена на «:», но «:» будет проигнорировано:

 <?php
$string='a:b:c:d';
$array=preg_split('#(?<!\):#',$string);
print_r($array);
?>
 

Результаты в:

Array ( [0] => a [1] => b [2] => c :d )

http://www.php.net//manual/en/function.preg-split.php