$re = '/(?<=;)"([^"]*)"(?=;)|([^;]+);?|;/s';
$str = '11221;"9 Test with ; semicolon";TST03;6011
48350;;;1919
48350;10 Test Reference *;;
23001;"Hello " Hello";"1234";4506
23001;Hello; " Hello";"1234";4506
BCNR_HEADQUARTERS_BANK;MERCHANT_NAME;MERCHANT_ID;MCC
80000;1 Fix Merchant Name;;
80000;2 *GUIMY0801C;300293199;
23000;3 * Merchant Name;;6011
23000;4Fix Merchant*;;6010
80000;5 MY1901000C\\**;45;6011
80000;6 Test Reference DY0800011C;300293199;
77800;7 Multiple "quotation" "marks;TST01;
78700;8 Special chars /*-+`?=)(/&%ç*"+;TST02;6010
BCNR_HEADQUARTERS_BANK;MERCHANT_NAME;MERCHANT_ID;MCC
80000;1 Fix Merchant Name;;
80000;2 *GUIMY0801C;300293199;
23000;3 * Merchant Name;;6011
23000;4 Fix Merchant*;;6010
80000;5 MY1901000C\\**;45;6011
80000;6 Test Reference DY0800011C;300293199;
77800;7 Multiple "quotation" "marks;6543;
78700;8 Special chars /*-+`?=)(/&%ç*"+;9999;6010
11221;"9 Test with ; semicolon";9999;6011
48350;10 Test Reference *;;
23001;"11 Escape char " which must not be interpreted";"MERID";4506
-- https://regex101.com/r/5b2Lsx/1
-- https://regex101.com/r/MnZLSH/1';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php