第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

匹配令牌及其可能重疊的上下文

匹配令牌及其可能重疊的上下文

PHP
溫溫醬 2022-01-24 10:43:36
我正在處理一些文本文件,并希望找到某些標(biāo)記以及圍繞它們的一些文本以獲得一些上下文。我的問題是,如果令牌的每個(gè)實(shí)例足夠接近以被其前面的令牌的上下文捕獲,我就無法找到它們。作為示例和簡(jiǎn)化,假設(shè)我想在某些文本中查找每個(gè) 5 位數(shù)字,以及前后 20 個(gè)字符以獲得一些上下文。首先我嘗試了類似的東西:<?php$text = "Lorem ipsum 11111 dolor sit 22222 amet, consectetur 33333 adipiscing elit, sed do eiusmod tempor 1111 incididunt ut 11111 labore et dolore magna aliqua.";$nmbrs_tmp = array();preg_match_all("@.{0,19}[^\d](\d{5})[^\d].{0,19}@s", $text, $nmbrs_tmp);print_r($nmbrs_tmp);但它不會(huì)捕獲 22222 因?yàn)樗呀?jīng)在 11111 的第一次捕獲中并且它是上下文://輸出大批(    [0] => 數(shù)組        (            [0] => Lorem ipsum 11111 dolor sit 22222 ame            [1] => t, consectetur 33333 adipiscing elit, se            [2] => 1111 incididunt ut 11111 labore et dolore ma        )    [1] => 數(shù)組        (            [0] => 11111            [1] => 33333            [2] => 11111        ))然后我嘗試了前瞻和后視,但第一個(gè):后視必須是固定長(zhǎng)度,第二個(gè):我不會(huì)再捕獲上下文了: "@(?<=.{0,19})[^\d](\d{5})[^\d](?=.{0,19})@s" //this won't work理想情況下,我會(huì)喜歡這樣的東西,在其中我捕獲 5 位數(shù)字的每個(gè)實(shí)例,并獲得所有可能的上下文://輸出大批(    [0] => 數(shù)組        (            [0] => Lorem ipsum 11111 dolor sit 22222 ame            [1] => sum 11111 dolor sit 22222 amet, consectetur 3            [2] => 2 amet, consectetur 33333 adipiscing elit, se            [3] => 1111 incididunt ut 11111 labore et dolore ma        )    [1] => 數(shù)組        (            [0] => 11111            [1] => 22222            [2] => 33333            [3] => 11111        ))如果無法使用正則表達(dá)式執(zhí)行此操作,那么我愿意接受涉及多次遍歷文本或使用更多正則表達(dá)式的 PHP 解決方案。
查看完整描述

1 回答

?
狐的傳說

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊

這是一種使用匹配偏移量來計(jì)算相關(guān)子字符串的方法:


<?php

$text = "99999 Lorem ipsum 11111 dolor sit 22222 amet, consectetur 33333 adipiscing elit, sed do eiusmod tempor 1111 incididunt ut 11111 labore et dolore magna aliqua. 99999";

$nmbrs_tmp = array();

preg_match_all("@\b\d{5}\b@s", $text, $nmbrs_tmp, PREG_OFFSET_CAPTURE);


foreach ($nmbrs_tmp[0] as $key => $field) {

    $offset = $field[1];

    $start = ( $offset>=20 ? $offset-20 : 0 );

    $length = $offset>=20 ? 45 : 45-(20-$offset);

    $nmbrs_tmp[0][$key][2] = substr( $text, $start, $length );

}


print_r($nmbrs_tmp);

首先,我們將正則表達(dá)式簡(jiǎn)化為只找到 5 位數(shù)字(您原來的正則表達(dá)式會(huì)丟失行首和行尾的數(shù)字)。


然后我們匹配,傳遞 PREG_OFFSET_CAPTURE 標(biāo)志。


$length最后,我們使用返回的偏移量來計(jì)算所需子字符串的長(zhǎng)度(如果落在輸入的末尾可能無關(guān)緊要,但如果您愿意,可以調(diào)整它)。


結(jié)果是:


Array

(

    [0] => Array

        (

            [0] => Array

                (

                    [0] => 99999

                    [1] => 0

                    [2] => 99999 Lorem ipsum 11111 d

                )


            [1] => Array

                (

                    [0] => 11111

                    [1] => 18

                    [2] => 99999 Lorem ipsum 11111 dolor sit 22222 ame

                )


            [2] => Array

                (

                    [0] => 22222

                    [1] => 34

                    [2] => sum 11111 dolor sit 22222 amet, consectetur 3

                )


            [3] => Array

                (

                    [0] => 33333

                    [1] => 58

                    [2] => 2 amet, consectetur 33333 adipiscing elit, se

                )


            [4] => Array

                (

                    [0] => 11111

                    [1] => 122

                    [2] =>  1111 incididunt ut 11111 labore et dolore ma

                )


            [5] => Array

                (

                    [0] => 99999

                    [1] => 159

                    [2] => olore magna aliqua. 99999

                )


        )


)


查看完整回答
反對(duì) 回復(fù) 2022-01-24
  • 1 回答
  • 0 關(guān)注
  • 147 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)