Вот попытка с preg_match
:
$pattern = "/^([^\[]+)\[([^\]]+)\]\s+\(([^,]+),\s+([^,]+),\s+([^,]+),\s+([^,]+)\)\s+(.+)$/i";
$string = "CADAVRES [FILM] (Canada : Québec, Érik Canuel, 2009, long métrage) FICTION";
preg_match($pattern, $string, $keywords);
array_shift($keywords);
print_r($keywords);
Вывод:
Array
(
[0] => CADAVRES
[1] => FILM
[2] => Canada : Québec
[3] => Érik Canuel
[4] => 2009
[5] => long métrage
[6] => FICTION
)
Распределение регулярных выражений: [ 1113]
^ anchor to start of string
( begin capture group 1
[^\[]+ one or more non-left bracket characters
) end capture group 1
\[ literal left bracket
( begin capture group 2
[^\]]+ one or more non-right bracket characters
) end capture group 2
\] literal bracket
\s+ one or more spaces
\( literal open parenthesis
( open capture group 3
[^,]+ one or more non-comma characters
) end capture group 3
,\s+ literal comma followed by one or more spaces
([^,]+),\s+([^,]+),\s+([^,]+) repeats of the above
\) literal closing parenthesis
\s+ one or more spaces
( begin capture group 7
.+ everything else
) end capture group 7
$ EOL
Это предполагает, что ваша структура статична и не особенно хороша, но, с другой стороны, должна быть устойчивой к разделителям, ползущим в поля, где они не должны быть. Например, заголовок, имеющий в себе :
или ,
, кажется правдоподобным и может нарушить решение типа «разбить на эти разделители в любом месте». Например,
"Matrix:, Trilogy() [FILM, reviewed: good] (Canada() : Québec , \t Érik Canuel , ): 2009 , long ():():[][]métrage) FICTIO , [(:N";
правильно обрабатывает как:
Array
(
[0] => Matrix:, Trilogy()
[1] => FILM, reviewed: good
[2] => Canada() : Québec
[3] => Érik Canuel
[4] => ): 2009
[5] => long ():():[][]métrage
[6] => FICTIO , [(:N
)
Кроме того, если область запятой в скобках имеет переменную длину Вы можете сначала извлечь это и проанализировать, а затем обработать остальную часть строки.
Если Вы знаете то, что вызывает эти 400, то Вы можете настраивать поведение http.sys с помощью реестра для контакта с ним:
http://support.microsoft.com/kb/820129
Однако необходимо знать, что существует потенциальная безопасность и разветвления производительности выполнения этого.
Другая опция состояла бы в том, чтобы использовать прокси фильтрации перед IIS, таким образом, получая запрос, прежде чем это пойдет дальше.
Если Ваш пользовательский клиент заставляет IIS инициировать HTTP 400, он, вероятно, испорчен и не отправляет действительные Запросы HTTP согласно стандарту. Если бы можно изменить клиент, это был бы правильный поступок. Иначе то, с чем Вы работаете, не является HTTP, и IIS разработан для обработки Запросов HTTP. Поэтому необходимо выполнить пользовательский сервер для собственного протокола (который является нестандартным HTTP как вещь).
Не рекомендуется использовать IIS/ASP.NET для обрабатывания такого запроса, поскольку это могло бы вызвать некоторые странные неожиданные вещи произойти.
Вместо этого я бы попросил их исправить пользовательское программное обеспечение клиента. Дайте им отчет, показывающий неудавшиеся запросы. Если вы можете, запустите сниффер, например Wireshark, и отправьте им пакеты, если они не уверены, что проблема в их программном обеспечении.