preg_split: разбиение строки по очень специфическому шаблону

Это хороший безопасный пример ...

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;
    }
}
2
задан Etienne Lehoux-Jobin 18 January 2019 в 03:30
поделиться

3 ответа

Вот попытка с 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
)

Попробуйте!

Кроме того, если область запятой в скобках имеет переменную длину Вы можете сначала извлечь это и проанализировать, а затем обработать остальную часть строки.

0
ответ дан ggorlen 18 January 2019 в 03:30
поделиться

Мне удалось найти решение, используя 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
)

Вышеупомянутое регулярное выражение рассматривает термин как любой символ, который не является чем-то вроде скобки, запятой, скобок и т. Д. два слова, возможно, с разделителем двоеточия в середине.

0
ответ дан Tim Biegeleisen 18 January 2019 в 03:30
поделиться

Вы можете использовать это регулярное выражение, чтобы разделить на:

([^\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]

0
ответ дан Nick 18 January 2019 в 03:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: