我能够匹配字符串中的所有文本,如下所示:
[!--$element--]
使用以下正则表达式:
\[!--(.*?)]
但是,现在我想匹配除上述字符串之外的所有内容,但似乎无法使其工作。我试图使用not ^
表达式和前瞻?!
表达式,但似乎无法正确使用。
例如,
我想要
This is an [!--$element--]
变成:
[!--$element--]
我正在使用PHP preg_replace()删除所有不是[--$element--]
的文本
知道我怎么能这样做吗?
答案 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]);
答案 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);