Почему это регулярное выражение не соответствует первому результату в php?

0

Вот мое регулярное выражение:

❰(❮\d+[\-\d]*❯)⦓([^⦔]*)⦔❱

Вот тестовый текст (онлайн-демонстрация в javascript, где он отлично работает):

Nulla imperdiet ❰❮6❯⦓ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse gravida consectetur mauris, eget ornare velit с последующим рисунком.⦔❱❰❮7❯⦓Morbi in quam id nulla facilisis vestibulum sit amet ornare est. Duis dolor erat, porttitor at eleifend congue, lacinia vitae est. Phasellus ac sem ut velit fermentum porta at sit amet neque.⦔❱❰❮8❯⦓Etiam in congue turpis. Cras volutpat est mauris. Nulla imperdiet libero vitae metus semper, sit amet dictum лексический плацерат.Энеан в вененати-либеро. "9-10❯⦓Aenean luctus at nibh eget scelerisque. Phasellus vel issat dui, eu euismod lacus. Nam id tellus tincidunt, tristique quam eu, cursus nulla. Suspendisse ac nibh lacinia, tempus enim quis, elementum nulla.. eu euismod.

Но это не работает в php. То есть, он не извлекает первое совпадение: т. ❰❮6❯⦓" От ❰❮6❯⦓" до vitae.⦔❱. Интригующе, если я удалю vitae.⦔❱ фрахтователь Unicode ("), он отлично работает, но добавляет его, делает это не соответствует первому совпадению. Почему это? и как этого можно избежать?


Объяснение регулярного выражения: Я хотел, чтобы соответствовать между содержанием и , если они являются единственным содержанием за исключением цифрового контента между ними и .

Пример для матча:

❰❮6❯⦓Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse gravida consectetur mauris, eget ornare velit и т.д.

Пример для не матча:

❰❮6❯⦓Lorem ipsum dolor sit amet, consectetur adipiscing elit.⦔ Suspendisse gravida consectetur mauris, eget ornare velit followat vitae.❱


Мой PHP-код:

<?php
$subject = "Nulla imperdiet ❰❮6❯⦓"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse gravida consectetur mauris,
         eget ornare velit consequat vitae.⦔❱❰❮7❯⦓Morbi in quam id nulla facilisis vestibulum sit amet ornare est. Duis dolor erat, 
        porttitor at eleifend congue, lacinia vitae est. Phasellus ac sem ut velit fermentum porta at sit amet neque.⦔❱❰❮8❯⦓Etiam in congue turpis. 
        Cras volutpat est mauris. Nulla imperdiet libero vitae metus semper, sit amet dictum lectus placerat. Aenean at venenatis libero.⦔❱❰❮9-10❯⦓Aenean 
        luctus at nibh eget scelerisque. Phasellus vel consequat dui, eu euismod lacus. Nam id tellus tincidunt, tristique quam eu,
        cursus nulla. Suspendisse ac nibh lacinia, tempus enim quis, elementum nulla. .⦔❱ eu euismod.";


$pattern = '#❰(❮\d+[\-\d]*❯)⦓([^⦔]*)⦔❱#';
preg_match_all($pattern, $subject, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>';    
?>

вывод:

Array
(
    [0] => Array
        (
            [0] => ❰❮7❯⦓Morbi in quam id nulla facilisis vestibulum sit amet ornare est. Duis dolor erat, 
        porttitor at eleifend congue, lacinia vitae est. Phasellus ac sem ut velit fermentum porta at sit amet neque.⦔❱
            [1] => ❰❮8❯⦓Etiam in congue turpis. 
        Cras volutpat est mauris. Nulla imperdiet libero vitae metus semper, sit amet dictum lectus placerat. Aenean at venenatis libero.⦔❱
            [2] => ❰❮9-10❯⦓Aenean 
        luctus at nibh eget scelerisque. Phasellus vel consequat dui, eu euismod lacus. Nam id tellus tincidunt, tristique quam eu,
        cursus nulla. Suspendisse ac nibh lacinia, tempus enim quis, elementum nulla. .⦔❱
        )

    [1] => Array
        (
            [0] => ❮7❯
            [1] => ❮8❯
            [2] => ❮9-10❯
        )

    [2] => Array
        (
            [0] => Morbi in quam id nulla facilisis vestibulum sit amet ornare est. Duis dolor erat, 
        porttitor at eleifend congue, lacinia vitae est. Phasellus ac sem ut velit fermentum porta at sit amet neque.
            [1] => Etiam in congue turpis. 
        Cras volutpat est mauris. Nulla imperdiet libero vitae metus semper, sit amet dictum lectus placerat. Aenean at venenatis libero.
            [2] => Aenean 
        luctus at nibh eget scelerisque. Phasellus vel consequat dui, eu euismod lacus. Nam id tellus tincidunt, tristique quam eu,
        cursus nulla. Suspendisse ac nibh lacinia, tempus enim quis, elementum nulla. .
        )

)
  • 0
    Кажется, работает нормально
  • 0
    @anubhava: я упомянул, что он отлично работал в онлайн-демонстрации. Это не работает в php. Это моя проблема, пожалуйста, проверьте это здесь: phpliveregex.com
Показать ещё 6 комментариев
Теги:
preg-match
preg-match-all
preg-replace

1 ответ

4
Лучший ответ

Вы соответствуете символам юникода, но вы не включили модификатор юникода, что означает, что символы Юникода не будут рассматриваться как то, что они на самом деле.

Из руководства:

u (PCRE_UTF8)
Этот модификатор включает дополнительные функции PCRE, которые несовместимы с Perl. Строка и предметные строки рассматриваются как UTF-8. Этот модификатор доступен с PHP 4.1.0 или выше в Unix и с PHP 4.2.3 на win32. UTF-8 справедливость шаблона и объекта проверяется с PHP 4.3.5. Недействительный объект приведет к тому, что функция preg_* будет соответствовать ничему; недопустимый шаблон вызовет ошибку уровня E_WARNING. Пять и шесть октетных последовательностей UTF-8 считаются недействительными с PHP 5.3.4 (соответственно PCRE 7.3 2007-08-28); ранее они считались действительными UTF-8.

Чтобы исправить вашу проблему, просто добавьте u в свое регулярное выражение:

$pattern = '#❰(❮\d+[\-\d]*❯)⦓([^⦔]*)⦔❱#u';
// Add the unicode modifier            ^

Ещё вопросы

Сообщество Overcoder
Наверх
Меню