регулярное выражение: выбрать все символы до и после определенной строки - PullRequest
1 голос
/ 24 апреля 2019

Я хочу выделить весь текст до и после определенной подстроки, для этого я использовал следующее выражение, но не выделил весь необходимый текст:

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

проверить эту ссылку для отладки

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

В шаблоне ^(?:(?!\<\?php echo[\s?](.*?)\;[\s?]\?\>).)* используется жадный жетон , который соответствует любому символу, кроме новой строки в начале строки ^, которая выполняет утверждение отрицательного взгляда.

Это будет соответствовать только customFields[

. В качестве примера вы можете использовать закаленный жадный токен regex demo , но вместо этого вы также можете просто использовать отрицательный символкласс и SKIP 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

0 голосов
/ 24 апреля 2019

Как насчет использования positive lookarounds:

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

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...