Получить регулярное выражение для сопоставления нескольких экземпляров одного и того же шаблона - PullRequest
1 голос
/ 08 марта 2019

Итак, у меня есть это регулярное выражение - regex101 :

\[shortcode ([^ ]*)(?:[ ]?([^ ]*)="([^"]*)")*\]

Попытка сопоставить эту строку

[shortcode contact param1="test 2" param2="test1"]

Прямо сейчас, регулярное выражение соответствует этому:

[contact, param2, test1]

Я бы хотел, чтобы это соответствовало:

[contact, param1, test 2, param2, test1]

Как получить регулярное выражение, соответствующее первому экземпляру шаблона параметров, а не только последнему?

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Вы можете использовать

'~(?:\G(?!^)\s+|\[shortcode\s+(\S+)\s+)([^\s=]+)="([^"]*)"~'

См. Демоверсию regex

Подробности

  • (?:\G(?!^)\s+|\[shortcode\s+(\S+)\s+)- либо конец предыдущего матча, либо 1+ пробелов сразу после (\G(?!^)\s+) или (|)
    • \[shortcode - буквенная строка
    • \s+ - 1+ пробелов
    • (\S+) - Группа 1: один или несколько непробельных символов
    • \s+ - 1+ пробелов
  • ([^\s=]+) - Группа2: 1+ символов, кроме пробелов и =
  • =" - буквальная подстрока
  • ([^"]*) - Группа 3: любые 0+ символов, кроме "
  • " - " char.

PHP демо

$re = '~(?:\G(?!^)\s+|\[shortcode\s+(\S+)\s+)([^\s=]+)="([^"]*)"~';
$str = '[shortcode contact param1="test 2" param2="test1"]';
$res = [];
if (preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0)) {
    foreach ($matches as $m) {
        array_shift($m);
        $res = array_merge($res, array_filter($m));
    }
}
print_r($res);
// => Array( [0] => contact [1] => param1  [2] => test 2 [3] => param2  [4] => test1 )
0 голосов
/ 08 марта 2019

Попробуйте использовать приведенное ниже регулярное выражение.

regex101

Ниже приведен пример использования,

var testString = '[shortcode contact param1 = "test 2 "param2 =" test1 "] ';

var regex = / [\ w \ s] + (? = [\ ="] | \ ") / gm;

varfound = para.match (regex);

Если вы зарегистрируетесь found , вы увидите результат как

["shortcode contact param1", "test 2", "param2 "," test1 "]

Регулярное выражение будет соответствовать всем буквенно-цифровым символам, включая подчеркивание и пробелы, только если за ними следуют =" или ".

Надеюсь, это поможет.

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