如何在正则表达式中匹配字符串后跟重复模式?
问题描述:
I'm looking for a regex to match the following pattern:
--header--
any text -pre-
any text -/pre-
-pre-
any text -/pre-
For example: the following text
--comment--
list of comments
-pre-
comment 1
-/pre-
-pre-
comment 2
-/pre-
--Answers--
list of Answers
-pre-
Answer 1
-/pre-
-pre-
Answer 2
-/pre-
should be returned as following when apply the regex:
Array
(
[comments] => Array
(
[0] => comment 1
[1] => comment 2
)
[answers] => Array
(
[0] => answer 1
[1] => answer 2
)
)
I tried the following regex --(.*?)--.*?(-pre-(.*?)-\/pre-)+
but it only match comment 1
and answer 1
Example Code: https://regex101.com/r/59OKzs/1
答
Regex:
(?:--([^-]+)--(?:(?!-pre-).)+|(?!\A)\G)\s*-pre-\s*((?:(?!-/pre-).)*)-/pre-\K
PHP:
preg_match_all('~(?:--([^-]+)--(?:(?!-pre-).)+|(?!\A)\G)\s*-pre-\s*((?:(?!-/pre-).)*)-/pre-\K~s', $str, $matches, PREG_SET_ORDER);
To integrate appropriate keys and values:
// Filter empty values
$matches = array_map(function($v) {
return array_values(array_filter($v));
}, $matches);
// Initialize two variables which we use them soon
$index = null; $finalArray = [];
// Iterate over recent matches in order to apply keys
array_map(function($array) use (&$index, &$finalArray) {
count($array) == 2 ? ($index = $array[0]) && ($finalArray[$index][] = $array[1]) : $finalArray[$index][] = $array[0];
}, $matches);
// Print out
print_r($finalArray);
答
Maybe use preg_match_all
with /--(.*?)--.*?-pre-
*(.*?)
*-\/pre-.*?-pre-
*(.*?)
*-\/pre-/s
preg_match_all('/--(.*?)--.*?-pre-
*(.*?)
*-\/pre-.*?-pre-
*(.*?)
*-\/pre-/s',$string,$matches, PREG_SET_ORDER);
for($i=0;$i<count($matches);$i++)
$output[$matches[$i][1]] = array($matches[$i][2], $matches[$i][3]);
print_r($output);