[英]Preg_match returning "extra" empty matches for new lines
以下表達式返回我需要的內容,但為每個以及任何空行提供了一個額外的空匹配。 這將導致5 個有效文本行返回10 個匹配項。 我預計這是我指定最后一個捕獲組的方式,或者不需要捕獲組#2。
我如何“忽略”換行符(或觸發額外匹配的任何內容)
/(\d+[az]?\.)?[ ]?(.*)/g
11a. A numbered agenda item
Unnumbered agenda item
12. Another numbered agenda item
Another UNnumbered agenda item
13. A numbered agenda item
我需要提取議程項目文本和前面的數字(如果存在)。
在您的模式中,您使用量詞?
和*
都是可選的,也可以匹配一個空字符串。
您獲得 10 個匹配項而不是 5 個匹配項的原因是該模式未錨定。 由於所有部分都是可選的,最后一個.*
可以“匹配”字符串中的最后一個 position。
您可以使用(.+)
在第二個捕獲組中捕獲 1 個或多個字符。
如果匹配應該在字符串的開頭,您可以使用錨^
^(\d+[a-z]?\.)?[ ]?(.+)
查看正則表達式演示
帶有可選模式的正則表達式只能在不匹配的字符序列之前匹配空字符串。
您可以使用
preg_match_all('/^(\d+[a-z]?\.)\s*(.*(?:\R(?!\d+[a-z]?\.).*)*)/m', $text, $matches)
請參閱正則表達式演示。
詳情:
^
- 行首(\d+[az]?\.)
- 第 1 組:一個或多個數字、一個可選字母和一個.
\s*
- 零個或多個空格(.*(?:\R(??\d+[az].\.).*)*)
- 第 2 組:該行的 rest,換行序列后不帶一個或多個數字,可選字母和一個.
然后是線路的rest,零次或多次。請參閱PHP 演示:
$text = "11a. A numbered agenda item\nUnnumbered agenda item\n12. Another numbered agenda item\nAnother UNnumbered agenda item\n13. A numbered agenda item";
if (preg_match_all('/^(\d+[a-z]?\.)\s*(.*(?:\R(?!\d+[a-z]?\.).*)*)/m', $text, $matches)) {
print_r(array_combine($matches[1], $matches[2]));
}
// => Array
// (
// [11a.] => A numbered agenda item
// Unnumbered agenda item
// [12.] => Another numbered agenda item
// Another UNnumbered agenda item
// [13.] => A numbered agenda item
// )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.