正则表达式:选择特定字符串之前和之后的所有字符

我想选择特定子字符串之前和之后的所有文本,我使用以下表达式来做到这一点,但它没有选择所有需要的文本:


/^(?:(?!\<\?php echo[\s?](.*?)\;[\s?]\?\>).)*/

例如:


$re = '/^(?:(?!\<\?php echo[\s?](.*?)\;[\s?]\?\>).)*/';

$str = 'customFields[<?php echo $field["id"]; ?>][type]';


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

它只会选择这部分customFields[,而预期结果应该是customFields[和][type]


慕后森
浏览 1923回答 2
2回答

小怪兽爱吃肉

该模式^(?:(?!\<\?php echo[\s?](.*?)\;[\s?]\?\>).)*使用经过调节的贪婪令牌,该令牌匹配从字符串开始处的新字符(除了^满足否定超前断言的字符串开始)之外的所有字符。那只会匹配&nbsp;customFields[对于您的示例数据,您可以使用经过改进的贪婪令牌regex演示,但也可以仅使用否定的字符类和SKIP FAIL:^[^[]+\[|<\?php&nbsp;echo\s(.*?)\;\s\?\>(*SKIP)(*FAIL)|\]\[[^]]*\]正则表达式演示|&nbsp;PHP演示例如$re = '/^[^[]+\[|<\?php echo\s(.*?)\;\s\?\>(*SKIP)(*FAIL)|\]\[[^]]*\]/';$str = 'customFields[<?php echo $field["id"]; ?>][type]';preg_match_all($re, $str, $matches, PREG_SET_ORDER);print_r($matches);结果Array(&nbsp; &nbsp; [0] => Array&nbsp; &nbsp; &nbsp; &nbsp; (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [0] => customFields[&nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; [1] => Array&nbsp; &nbsp; &nbsp; &nbsp; (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [0] => ][type]&nbsp; &nbsp; &nbsp; &nbsp; ))为了获得更精确的匹配,您还可以使用捕获组:^((?:(?!<\?php echo[\s?](?:.*?)\;\s\?>).)*)<\?php echo\s(?:.*?)\;[\s?]\?>(.*)$regex演示|&nbsp;PHP演示

蝴蝶不菲

如何使用positive lookarounds:(.*)(?=\<\?php&nbsp;echo)|(?<=\?\>)(.*)演示版
打开App,查看更多内容
随时随地看视频慕课网APP