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

时间:2019-04-24 10:22:20

标签: php regex

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

/^(?:(?!\<\?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]

check this link for debugging

2 个答案:

答案 0 :(得分:1)

模式^(?:(?!\<\?php echo[\s?](.*?)\;[\s?]\?\>).)*使用tempered greedy token,该字符串匹配从字符串^开始的换行符以外的任何字符,该字符串满足否定先行的断言。

那只会匹配customFields[

对于示例数据,您可以使用经过调节的贪婪令牌regex demo,但是也可以仅使用negated character classSKIP FAIL

^[^[]+\[|<\?php echo\s(.*?)\;\s\?\>(*SKIP)(*FAIL)|\]\[[^]]*\]

Regex demo | Php demo

例如

$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
(
    [0] => Array
        (
            [0] => customFields[
        )

    [1] => Array
        (
            [0] => ][type]
        )

)

要获得更精确的匹配,您还可以使用捕获组:

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

regex demo | Php demo

答案 1 :(得分:0)

如何使用positive lookarounds

(.*)(?=\<\?php echo)|(?<=\?\>)(.*)

Demo