PHP正则表达式匹配函数名称和参数与字符串像针(针|针)

I am filtering database results with a query string that looks like this:

attribute=operator(value|optional value)

I'll use

$_GET['attribute'];

to get the value.

I believe the right approach is using regex to get matches on the rest.

The preferred output would be

print_r($matches);
array(
    1 => operator
    2 => value
    3 => optional value
)

The operator will always be one word and consist of letters: like(), between(), in().

The values can be many different things including letters, numbers, spaces commas, quotation marks, etc...

I was asked where my code was failing and didn't include much code because of how poorly it worked. Based on the accepted answer, I was able to whip up a regex that almost works.

EDIT 1

$pattern = "^([^\|(]+)\(([^\|()]+)(\|*)([^\|()]*)";

Edit 2

$pattern = "^([^\|(]+)\(([^\|()]+)(\|*)([^\|()]*)"; // I thought this would work.

Edit 3

$pattern = "^([^\|(]+)\(([^\|()]+)(\|+)?([^\|()]+)?"; // this does work!

Edit 4

$pattern = "^([^\|(]+)\(([^\|()]+)(?:\|)?([^\|()]+)?"; // this gets rid of the middle matching group.  

The only remaining problem is when the 2nd optional parameter does not exist, there is still an empty $matches array.

This script, with the input "operator(value|optional value)", returns the array you expect:

<?php
    $attribute = $_GET['attribute'];
    $result = preg_match("/^([\w ]+)\(([\w ]+)\|([\w ]*)\)$/", $attribute, $matches);

    print($matches[1] . "
");
    print($matches[2] . "
");
    print($matches[3] . "
");
?>

This assumes your "values" match [\w ] regexp (all word characters plus space), and that the | you specify is a literal |...