Поскольку Барт спрашивает: Конечно, вы также можете использовать регулярные выражения, чтобы разделить на неэкранированных; и примите во внимание сбежавшие символы выхода. Просто становится немного грязно:
<?
$str = "abc;def\;abc\\\\;def";
preg_match_all('/((?:[^\\\\;]|\\\.)*)(?:;|$)/', $str, $arr);
print_r($arr);
?>
Array
(
[0] => Array
(
[0] => abc;
[1] => def\;abc\\;
[2] => def
)
[1] => Array
(
[0] => abc
[1] => def\;abc\\
[2] => def
)
)
Для этого нужно взять регулярное выражение для «(любой символ, кроме \ и;) или (\, сопровождаемый любым символом)» и разрешить любое их число, после которого следует символ «; или конец строки.
Я не уверен, как php обрабатывает $ и символы конца строки в строке, вам может потребоваться установить некоторые параметры регулярного выражения, чтобы получить именно то, что вы хотите для них.