匹配除变量字符串之外的所有内容

时间:2014-07-29 22:15:33

标签: regex

我能够匹配字符串中的所有文本,如下所示:

[!--$element--]

使用以下正则表达式:

\[!--(.*?)]

但是,现在我想匹配除上述字符串之外的所有内容,但似乎无法使其工作。我试图使用not ^表达式和前瞻?!表达式,但似乎无法正确使用。

例如,

我想要

This is an [!--$element--]

变成:

[!--$element--]

我正在使用PHP preg_replace()删除所有不是[--$element--]的文本

知道我怎么能这样做吗?

4 个答案:

答案 0 :(得分:3)

捕获组,(*SKIP)(*F)或拆分

为了配合这一点,我们有几种选择。

选项1:使用捕获组

这是一种更长的方法,但它适用于所有引擎。

\[!--[^-]*--\]|((?:(?!\[!--[^-]*--\]).)+)

您想要的字符串在第1组中。在 the Regex Demo 中,查看右侧面板中的捕获。

选项2:(*跳过)(* F)

这只适用于Perl和PCRE(以及PHP)。它直接匹配字符串。

\[!--[^-]*--\](*SKIP)(*F)|(?:(?!\[!--[^-]*--\]).)+

the Regex Demo 中,查看匹配的字符串。

选项3:拆分

Match All and Split are Two Sides of the Same Coin,因此我们可以使用preg_split代替preg_match_all。通过拆分字符串,我们删除了要排除的部分。

$element_regex = '~\[!--[^-]*--\]~';
$theText = preg_split($element_regex, $yourstring);

<强>解释

此问题是此问题中向"regex-match a pattern, excluding..."

解释的技术的典型案例

选项1。在选项1中,替换|的左侧与完成[!--$element--]匹配。我们将忽略这些匹配。右侧匹配并捕获其他文本,我们知道它是正确的,因为它与左侧的表达不匹配。

选项2 。在选项2中,交替|的左侧匹配完成[!--$element--]然后故意失败,之后引擎跳到字符串中的下一个位置。右侧与您想要的this字匹配,我们知道它们是正确的,因为它们与左侧的表达不匹配。

参考

答案 1 :(得分:2)

不要替换您不想要的文本,只需抓住您想要的文本:

preg_match_all('/\[!--(.*?)]/', $input, $matches);
$result = implode('', $matches[0]);

Demo

答案 2 :(得分:0)

请注意,我没有使用[!--(.*?)]因为它也会匹配与[!--$element--]不同的元素[!--$element]

<?php
$text ='This is an [!--$element--]. Here is some other text';
preg_match_all('#(\[\!--.*--\])#',$text,$out);
print_r($out);
?>

输出

Array
(
    [0] => Array
        (
            [0] => [!--$element--]
        )

    [1] => Array
        (
            [0] => [!--$element--]
        )

)

以下是在线 Demo

答案 3 :(得分:0)

将preg_replace与此模式Demo

一起使用
preg_replace("/(.*)(\[!--.*?])(.?)/", "\1\3", $input_lines);
相关问题