为什么这个正则表达式与php中的第一个结果不匹配?

时间:2015-02-02 08:21:26

标签: php regex preg-replace preg-match preg-match-all

这是我的正则表达式:

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

这是测试文本(online demo in javascript,它可以正常工作):

  

Nullaimperdiet❰❮6❯⦓“Lorem ipsum dolor sit amet,consectetur adipiscing elit。 Suspendisse gravida consectetur mauris,eget ornare velitconsequatvitae.⦔❱❰❮7❯⦓Morbiinquam id nulla facilisis vestibulum sit amet ornare est.Duis dolor erat,porttitor at eleifend congue,lacinia vitae est.Chasellus ac sem ut velit fermentum porta at sitametneque.⦔❱❰❮8❯⦓Etiamin congue turpis。 Cras volutpat est mauris。 Nulla imperdiet libero vitae metus semper,坐在amet dictum lectus placerat。 Aenean atvenenatislibero.⦔❱❰❮9-10❯⦓Aeneanluctusat 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。 。⦔❱euismod。

但它在php中不起作用。也就是说,它不会检索第一场比赛:即从❰❮6❯⦓“vitae.⦔❱。有趣的是,如果我删除Unicode双引号charterer(“),它工作正常,但添加它,使它不匹配第一个匹配。为什么是这样?如何避免这种情况?


正则表达式的说明:我想匹配之间的内容,如果它们是之间排除数字内容的唯一内容。

匹配示例:

  

❰❮6❯⦓Loremipsum dolor sit amet,consectetur adipiscing elit。 Suspendisse gravida consectetur mauris,eget ornare velit consequatvitae.⦔❱

不匹配的示例:

  

❰❮6❯⦓Loremipsum dolor sit amet,consectetur adipiscingelit.⦔Fuspendissegravida consectetur mauris,eget ornare velit consequatvitae.❱


我的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. .
        )

)

1 个答案:

答案 0 :(得分:4)

您正在匹配unicode字符,但您没有包含unicode modifier,这意味着unicode字符将不会被视为实际字符。

来自manual

  

u(PCRE_UTF8)
  此修饰符打开与Perl不兼容的PCRE的其他功能。模式和主题字符串被视为UTF-8。此修饰符可从Unix上的PHP 4.1.0或更高版本以及win32上的PHP 4.2.3获得。自PHP 4.3.5起,检查模式和主题的UTF-8有效性。无效主题将导致preg_*函数无匹配;无效模式将触发级别E_WARNING的错误。自PHP 5.3.4起,五个和六个八位字节UTF-8序列被视为无效(分别为PCRE 7.3 2007-08-28);以前那些被认为是有效的UTF-8。

要解决您的问题,只需将u附加到正则表达式:

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