Code
See regex in use here
\[quote\](.*?)\|-(.*?)\[\/quote\]
Note: The regex above uses the s modifier. Alternatively, you can replace . with [\s\S] and disable the s modifier
Usage
$re = '/\[quote\](.*?)\|-(.*?)\[\/quote\]/s';
$str = '[quote]Silence in the boatyard, Silence in the street, The Locks and Quays of Haganport Will rob you while you sleep.|-popular children\'s rhyme[/quote]
[quote]Silence you sleep.|-popular children\'s rhyme[/quote]';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Results
Input
[quote]Silence in the boatyard, Silence in the street, The Locks and
Quays of Haganport Will rob you while you sleep.|-popular children's
rhyme[/quote]
[quote]Silence you sleep.|-popular children's rhyme[/quote]
Output
The output below is organized by group (separated by newline)
Silence in the boatyard, Silence in the street, The Locks and Quays of Haganport Will rob you while you sleep.
popular children's rhyme
Silence you sleep.
popular children's rhyme
Explanation
\[quote\] Match this literally (backslashes escaping the following character)
(.*?) Capture any character any number of times, but as few as possible into capture group 1
\|- Match this literally (backslashes escaping the following character)
(.*?) Capture any character any number of times, but as few as possible into capture group 2
\[\/quote\] Match this literally (backslashes escaping the following character)
smodifier (append if after the regex delimiter).