Это хороший безопасный пример ...
function escapeHtml(str) {
if (typeof(str) == "string"){
try{
var newStr = "";
var nextCode = 0;
for (var i = 0;i < str.length;i++){
nextCode = str.charCodeAt(i);
if (nextCode > 0 && nextCode < 128){
newStr += "&#"+nextCode+";";
}
else{
newStr += "?";
}
}
return newStr;
}
catch(err){
}
}
else{
return str;
}
}
Вот попытка с 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
)
Кроме того, если область запятой в скобках имеет переменную длину Вы можете сначала извлечь это и проанализировать, а затем обработать остальную часть строки.
Мне удалось найти решение, используя preg_match_all
:
$input = "CADAVRES [FILM] (Canada : Québec, Érik Canuel, 2009, long métrage) FICTION";
preg_match_all("|[^-\\[\\](),/\\s]+(?:(?: :)? [^-\\[\\](),/]+)?|", $input, $matches);
print_r($matches[0]);
Array
(
[0] => CADAVRES
[1] => FILM
[2] => Canada : Québec
[3] => Érik Canuel
[4] => 2009
[5] => long métrage
[6] => FICTION
)
Вышеупомянутое регулярное выражение рассматривает термин как любой символ, который не является чем-то вроде скобки, запятой, скобок и т. Д. два слова, возможно, с разделителем двоеточия в середине.
Вы можете использовать это регулярное выражение, чтобы разделить на:
([^\w:]\s[^\w:]?|\s[^\w:])
Он ищет не- (слово или :
) символ, за которым следует пробел, за которым следует необязательный не- (слово или :
) персонаж; или пробел, за которым следует не (слово или :
) символ. Это будет соответствовать всем вашим желаемым шаблонам разделения. В PHP (обратите внимание, вам нужен модификатор u
для работы с символами Юникода):
$input = "CADAVRES [FILM] (Canada : Québec, Érik Canuel, 2009, long métrage) FICTION";
$keywords = preg_split('/([^\w:]\s[^\w:]?|\s[^\w:])/u', $input);
print_r($keywords);
Вывод:
Array
(
[0] => CADAVRES
[1] => FILM
[2] => Canada : Québec
[3] => Érik Canuel
[4] => 2009
[5] => long métrage
[6] => FICTION
)
Демонстрация на 3v4l.org [ 1111]