簡體   English   中英

preg_match搜索

[英]preg_match search

<?php
$content = "
{php
    {php 1 php}
    {php 2 php}
    {php 3 php}
php}"; 

我怎么能得到4個字符串?

第一:

{php 1 php}
{php 2 php}
{php 3 php}

第二:

1

第三:

2

四:

3

雖然您可以使用簡單的計數器輕松解析此類輸入,但可以使用遞歸正則表達式來獲取所需內容。 一個簡單的(?)正則表達式來驗證輸入將是:

^({php\s*(\d+|(?1)+)\s*php}\s*)$

(?1)是一個遞歸匹配,它試圖再次匹配第一個組,這是另一個{php ... php}標記。 我們還在php之間有一個捕獲組來捕獲它們的內容。

在您的情況下,您希望捕獲重疊結果(事實上,甚至包含在其他結果中的結果)。 這甚至不那么漂亮,但仍然可以使用前瞻。 環視可以有捕獲組,因此模式將是:

(?=({php\s*(\d+|(?1)+)\s*php}\s*))

結果有兩個額外的捕獲組 - 空白結果用於環顧四周,整個標記用外部{php ... php} ,但如果你使用PREG_PATTERN_ORDER你的預期結果將在第三個位置( [2] ) :

[2] => Array
(
    [0] => {php 1 php}
           {php 2 php}
           {php 3 php}
    [1] => 1
    [2] => 2
    [3] => 3
)

這是一個更復雜的例子: http//ideone.com/sWWrT

現在,強制要求謹慎。 正如我之前所說的,通過一個簡單的深度計數器,它更具可讀性和可維護性,除了娛樂用途之外,你真的不需要這里的正則表達式。

$regex = preg_match_all("/({php (\d+) php})+/", $content);
$regex[0][0] == "{php 1 php}";
$regex[0][1] == "{php 2 php}";
$regex[0][2] == "{php 3 php}";
end($regex)[0] == "1";
end($regex)[1] == "2";
end($regex)[2] == "3";

正在尋找這樣的東西?

暫無
暫無

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

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