Regex отрицательного просмотра назад не работает в PHP - PullRequest
1 голос
/ 08 мая 2020

Я написал фрагмент кода в PHP, который предназначен для сопоставления наречия (слово, оканчивающегося на 'ly'), которое не должно соответствовать любому слову, которое является ежедневным, еженедельным, ежемесячным, двух- ежедневно, раз в две недели и т.д. c.

Например, учитывая предложение Locally meet daily for 3 days, должно совпадать только Locally.

Я прибил синтаксис Regex, используя отрицательный просмотр назад, но PHP выдает мне ошибку:

Ошибка компиляции: утверждение lookbehind не имеет фиксированной длины по смещению ..

Вот мой полный код в PHP:

<?php
$sentence = "Locally meet daily for next 3 days";

// Use preg_match() function to check match 
preg_match('/(\w+ly)(?<!(daily|weekly|monthly))/', $sentence, $matches, PREG_OFFSET_CAPTURE); 

// Display matches result 
print_r($matches); 

Я пробовал использовать негативный просмотр вперед, но он не дал мне многообещающих результатов. Кто-нибудь может предложить, что можно сделать? Спасибо

1 Ответ

1 голос
/ 08 мая 2020

Вы можете использовать отрицательный просмотр вперед, но он должен быть перед вашей группой соответствия. Вам также необходимо добавить утверждение разрыва слова (\b) в начале регулярного выражения, чтобы (например) регулярное выражение не соответствовало aily в daily, а другое в конце, чтобы вы не t сопоставить слова с ly в середине, например, newlywed:

$sentence = "Locally meet daily newlywed for next 3 days";

preg_match_all('/\b(?!(?:daily|weekly|monthly))(\w+ly)\b/', $sentence, $matches, PREG_OFFSET_CAPTURE); 

print_r($matches); 

Вывод:

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

Демо на 3v4l.org

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