捕获引号中多次出现的单词

时间:2019-04-19 19:48:06

标签: php regex

我需要使用正则表达式捕获类名的所有实例和变体,但我无法弄清楚正确的模式,当前它与引号内的整个文本匹配

我打算在php preg_replace_callback()中使用该模式

['"].*([a-zA-Z0-9-_]*elementor[a-zA-Z0-9-_]*).*['"]

我测试的文字是

$backgroundVideoContainer.addClass('elementor-edit new-elementor-invisible class-new');
$backgroundVideoContainer.addClass('elementor-loading elementor-invisible');
$backgroundVideoContainer.addClass('media noelementor');

演示位于https://regex101.com/r/ykVhYy/3

使用上述模式,它可以捕获以下内容:

匹配1:元素不可见

匹配2:元素不可见

匹配3:元素

预期结果 应为:

文本行1:元素编辑,新元素不可见

文本行2:元素加载,元素或不可见

文本行3:不匹配

1 个答案:

答案 0 :(得分:2)

您可以使用\G指令在PHP中使用此正则表达式:

(?:'|(?!^)\G)\h*(?:([\w-]*\belementor\b[\w-]*)|[\w-]+)\b(?=[\w\h-]*')

RegEx Demo

  • \G在上一场比赛的末尾或首场比赛的字符串开头断言位置
  • (?=[\w\h-]*')是肯定的预言,可以断言我们在0个或多个单词,空格或连字符之后加一个单引号。

请注意,您的匹配项在捕获的#1组中可用。

PHP代码:

$re = '/(?:'|(?!^)\G)\h*(?:([\w-]*\belementor\b[\w-]*)|[\w-]+)\b(?=[\w\h-]*')/m';
$str = '$backgroundVideoContainer.addClass(\'elementor-edit new-elementor-invisible class-new\');
$backgroundVideoContainer.addClass(\'elementor-loading elementor-invisible\');
$backgroundVideoContainer.addClass(\'media noelementor\');';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the match result from group #1
print_r($matches[1]);