Как сделать правильное регулярное выражение - PullRequest
0 голосов
/ 23 февраля 2010

Я хочу получить $ {1} = Название, $ {2} = Открыто, $ {3} = Бла-бла-бла.

от

{{Title|Open
Bla-bla-bla 
}}

Ответы [ 4 ]

3 голосов
/ 23 февраля 2010

Что-то вроде этого:

$str = <<<STR
{{Title|Open
Bla-bla-bla 
}}
STR;

$matches = array();
if (preg_match("/^\{\{([^\|]+)\|([^\n]+)(.*)\}\}$/s", $str, $matches)) {
    var_dump($matches);
}

Это даст вам:

array
  0 => string '{{Title|Open
Bla-bla-bla 
}}' (length=28)
  1 => string 'Title' (length=5)
  2 => string 'Open' (length=4)
  3 => string '
Bla-bla-bla 
' (length=14)

Это означает, что после использования trim на $matches[1], $matches[2] и $matches[3] вы получите то, что просили: -)


Объясняя регулярное выражение:

  • совпадение с начала строки: ^
  • два { символа, которые необходимо экранировать, поскольку они имеют особое значение
  • все, что не является |, хотя бы один раз: [^\|]+
    • между (), поэтому он захвачен - возвращается как первая часть результата
    • | тоже нужно убежать.
  • a | символа - который должен быть экранирован.
  • Все, что не является разрывом строки, хотя бы один раз: [^\n]+
    • между (), так что он тоже захвачен - вторая часть результата
  • .* практически "что-нибудь" любое количество раз
    • между (), так что он тоже захвачен - третья часть результата
  • и, наконец, два } (тоже сбежал)
  • и конец строки: $

И обратите внимание, что регулярное выражение имеет модификатор s (dotall) ; см. Модификаторы шаблонов , об этом.

3 голосов
/ 23 февраля 2010
$string = "{{Title|Open
Bla-bla-bla 
}}";

preg_match('/^\{\{([^|]+)\|(.*?)[\r\n]+(.*?)\s*\}\}/', $string, $matches);
print_r($matches);
1 голос
/ 23 февраля 2010

http://www.gskinner.com/RegExr/

полезное место для игры и изучения регулярных выражений.

0 голосов
/ 23 февраля 2010

В Perl:

/\{\{         # literal opening braces
 (.*?)        # some characters except new line (lazy, i. e. as less as possible)
 \|           # literal pipe
 (.*?)        # same as 2 lines above
 \n           # new line
 ([\s\S]*?)   # any character, including new line (lazy)
 \}\}/x;      # literal closing braces

Принятие более точного решения зависит от того, какие именно правила вы хотите использовать для извлечения ваших полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...