簡體   English   中英

為什么這個正則表達式與php中的第一個結果不匹配?

[英]Why does this regular expression not match the first result in php?

這是我的正則表達式:

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

這是測試文本( 使用javascript的在線演示可以正常工作):

Nulla imperdiet❰❮6❯⦓“ Lorem ipsum dolor坐着,獻身自私。 ❯⦓7❯⦓bi bi bi bi sit sit Du Du Du Du do,,,,,,,,,,❯⦓❯⦓❯⦓❯⦓❯⦓❯⦓❯⦓❯⦓❯⦓❯⦓❯⦓❯⦓❯⦓❯⦓ a8metEtiam在congue turpis。 Cras volutpat est mauris。 Nulla imperdiet libero vitae metus semper,坐在amet dictum lectus placerat。 Aenean在venenatislibero。⦔❱❰❮9-10❯⦓Aeneanluctus在小提琴。 菜豆,eueusod lacus。 Nam id Tellus Tincidunt,Trisique quam eu,cursus nulla。 Suspendisse ac nibh lacinia,暫時性的,無效。 .⦔❱eu euismod。

但這在php中不起作用。 也就是說,它不會檢索第一個匹配項:即,從❰❮6❯⦓“vitae.⦔❱ 有趣的是,如果我刪除了Unicode雙引號租約者(“),它可以正常工作,但是添加它會使它與第一個匹配項不匹配。 為什么是這樣? 以及如何避免這種情況?


正則表達式的說明:我想匹配之間的內容 ,如果他們是不包括數字內容的插圖中的唯一內容

匹配示例:

❰❮6❯⦓Loremipsum dolor坐下,私服貼身小精靈。 毛豆的懸浮,evel ornare velit的生命。

不匹配示例:

❰❮6❯⦓Loremipsum dolor坐下,保持良好的自閉狀態。⦔Suspendisse gravida consectetur毛里斯,得到ornare velit帶來的生命。


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

)

您正在匹配unicode字符,但尚未包括unicode修飾符 ,這意味着unicode字符將不會被視為它們的實際含義。

手冊

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起(分別為PCRE 7.3 2007-08-28),五個和六個八位字節的UTF-8序列被視為無效; 以前那些被認為是有效的UTF-8。

要解決您的問題,只需將u附加到正則表達式中即可:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM