[英]php regular expressions groups
我是 php 和 regex 的新手,我遇到了一個問題。
我有一個看起來像這樣的文本,例如:“名字:sdfksdfkjskdlfjlskdf 更多數據:dsfkskldfjsdkfjsdkf 額外數據:dsfksdfjlsdjfklsdf”
我想感染三組,一組用於 FIRST NAME,另一組用於 MORE DATA,第三組用於 EXTRA DATA。 所以這是我的正則表達式:
FIRST NAME:(.*)MORE DATA:(.*)EXTRA DATA:(.*)
這就是我在java中的做法。
但是現在,我如何將它與 php 匹配,以便我可以回顯如下內容:
echo "more data: " . matche(group(1));
例如。
謝謝!
編輯:如果我讓它自己重復呢? 例如: FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf
我怎么做
嚴格根據您的輸入:
$re = "/(FIRST NAME\\s*:)\\s*(.*)(MORE DATA\\s*:\\s*)(.*)(EXTRA DATA\\s*:\\s*)(.*)/";
$str = "FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf";
preg_match_all($re, $str, $matches);
然后檢查$matches
變量。 這樣,您將擁有具有匹配項的組: FIRST NAME:first-name-value
, MORE DATA: more-data-value
, EXTRA DATA: extra-data-value
。
讓我們這樣做:
preg_match('/FIRST NAME:\s*(.*?)\s*MORE DATA:\s*(.*?)\s*EXTRA DATA:\s*(.*)\s*/', $line, $matches);
您的比賽結果現在將在$matches
,如下所示:
php > var_dump($matches);
array(4) {
[0]=>
string(93) "FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsd"
[1]=>
string(20) "sdfksdfkjskdlfjlskdf"
[2]=>
string(19) "dsfkskldfjsdkfjsdkf"
[3]=>
string(17) "dsfksdfjlsdjfklsd"
}
php >
因此, $matches[1]
是第一組,依此類推。 [0]
是整個比賽結果。
您的正則表達式旨在在任何正則表達式引擎中的每個非換行符字符串中僅找到一個匹配項,因為最后一個.*
與任何字符匹配0或更多次。
如果您的輸入始終將這3個部分重復多次,請使用惰性點匹配,並在最后一個之后添加正向前行,以確保我們匹配到字符串末尾或FIRST NAME:
:
FIRST NAME:(.*?)MORE DATA:(.*?)EXTRA DATA:(.*?)(?=$|FIRST NAME:)
^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^
觀看此正則表達式演示
在這里, (.*?)
盡可能少地匹配0+除換行符以外的任何字符,並且(?=$|FIRST NAME:)
零寬度斷言需要.*?
匹配第一個:字符串的末尾或FIRST NAME:
PHP注意:在Java中,使用Matcher#find
查找部分匹配並運行while
循環。 在PHP中,只需使用preg_match_all
:
$re = "/FIRST NAME:(.*?)MORE DATA:(.*?)EXTRA DATA:(.*?)(?=$|FIRST NAME:)/";
$str = "FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf";
preg_match_all($re, $str, $matches);
print_r($matches[1]); // Print Group 1
print_r($matches[2]); // Print Group 2
print_r($matches[3]); // Print Group 3
如果您是正則表達式優化迷,請展開惰性匹配組:
FIRST NAME:([^M]*(?:M(?!ORE DATA:)[^M]*)*)MORE DATA:([^E]*(?:E(?!XTRA DATA:)[^E]*)*)EXTRA DATA:([^F]*(?:F(?!IRST NAME:)[^F]*)*)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.