簡體   English   中英

preg_match_all PHP的條件正則表達式模式

[英]Conditional regex pattern for preg_match_all PHP

我有一個模式。 每當不存在特定的匹配組時,即使它跳過下一個匹配組,它也會跳過並找到另一個匹配項。

有4個捕獲組。

第一組,第二組,第三組,第四組

第三組並不總是在那里。 在我的示例字符串中,有3套。 第一個不包含第三組的任何字符。 我需要第三組的條件聲明。 如果找不到任何字符,則應捕獲空格或空格。

演示: https//regex101.com/r/zK0aW4/1

它應該像這樣: https : //regex101.com/r/sD4eB7/1

但我不知道如何為此分配條件。

如果不存在第三個匹配項,則應為空白。 如何以正則表達式模式編寫此代碼?

例如:

$string = "\nTHIS IS FIRST PATTERN 63101 0789158126 0-0000000-000-0000\n4415 THIS IS FIRST \nPATTERN 49401-9528\n0406842931 Third match 0-0000000-000-0000\n11403 THIS IS FIRST PATTERN 49401-\n9595\n0112853789 Third match 0-0000000-000-0000";

preg_match_all(
    "/([A-Z ,\.\-\&#\\\\n\/0-9&]+)(\d{10})([A-Z a-z]+)(\d{1}-\d{7}-\d{3}-\d{4}|\d{1}-\d{7}-\d{2}-\d{4})/",
    $string,
    $matches
);

這應該輸出類似:

array(3) {
  [0]=>
  array(3) {
    [0]=>
    string(78) "\nTHIS IS FIRST PATTERN 63101 0789158126 0-0000000-000-0000"
    [1]=>
    string(84) "\n4415 THIS IS FIRST \nPATTERN 49401-9528\n0406842931 Third match 0-0000000-000-0000"
    [2]=>
    string(87) "\n11403 THIS IS FIRST PATTERN 49401-\n9595\n0112853789 Third match 0-0000000-000-0000"
  }
  [1]=>
  array(5) {
    [0]=>
    string(36) "\nTHIS IS FIRST PATTERN 63101"
    [1]=>
    string(42) "\n4415 THIS IS FIRST \nPATTERN 49401-9528\n"
    [2]=>
    string(45) "\n11403 THIS IS FIRST PATTERN 49401-\n9595\n"
  }
  [2]=>
  array(3) {
    [0]=>
    string(10) "0789158126"
    [1]=>
    string(10) "0406842931"
    [2]=>
    string(10) "0112853789"
  }
  [3]=>
  array(3) {
    [0]=>
    string(15) " "
    [1]=>
    string(15) " Third match "
    [2]=>
    string(15) " Third match "
  }
  [4]=>
  array(3) {
    [0]=>
    string(17) "0-0000000-000-0000"
    [1]=>
    string(17) "0-0000000-000-0000"
    [2]=>
    string(17) "0-0000000-000-0000"
  }
}

試試這個: https : //regex101.com/r/zK0aW4/2

((?:[A-Z ,.&#\/0-9-]|&|\\n)+?)(\d{10})([A-Z a-z]+)?(\d{1}-\d{7}-\d{3}-\d{4}|\d{1}-\d{7}-\d{2}-\d{4})

由於您的初始組有很多比賽,因此擴展范圍過大。 通過更改為非貪婪或惰性匹配( *?+? ),它將盡可能少地匹配。 這使其在以下模式下表現更好。

字符類(由[]包圍)用於匹配單個字符; 我假設您只想匹配文字& \\n ,因此將它們移出字符類。

暫無
暫無

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

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