簡體   English   中英

正則表達式,php,“ AND”

[英]Regular expressions ,php, “AND”

我試圖從一個字符串中搜索三個數據,它們是:

first name, space ,last name  (?=[A-Z][a-z]+\s[A-Z][a-z]+) 
//AND
first name ,space ,last name ,and suffix (?=[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+) 
//AND,
age   (?=[0-9]{2})

從幾個教程中,我已經看到這三種模式:

(?=[A-Z][a-z]+\s[A-Z][a-z]+)(?=[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+)(?=[0-9]{2})

在一起應該是我的解決方案,但它不起作用....任何建議....(它是一個php腳本,我使用preg_match_all)

我的腳本:

$content = file_get_contents('http://www.somesite.com');
$pattern = '/(?=[A-Z][a-z]+\s[A-Z][a-z]+)(?=[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+)(?=[0-9]{2}) /';
if(preg_match_all($pattern,$content,$matches))
{
// has the pattern, do something
//$matches has all the matches from preg_match

  }

該多次超前的技巧有時是當您知道某些組件必須存在,但您不知道它們將以什么順序出現時。您經常在執行強密碼策略的正則表達式中看到它。

您的問題要簡單得多; 組件總是以相同的順序排列,但是最后一個是可選的。 這要容易得多:

'/\b([A-Z][a-z]*)\s+([A-Z][a-z]*)(?:\s+([0-9]{2}))?\b/'

名字在#1組中捕獲,姓氏在#2組中,如果有后綴,則在#3組中找到它。

您正在尋找OR運算符,而不是AND:

[A-Z][a-z]+\s[A-Z][a-z]+|[A-Z][a-z]+\s[A-Z][a-z]+\s[A-Z][a-z]+|[0-9]{2}

如果單詞之間可以有多個空格字符,請確保量化\\s

[A-Z][a-z]+\s+[A-Z][a-z]+|[A-Z][a-z]+\s+[A-Z][a-z]+\s+[A-Z][a-z]+|[0-9]{2}

而且,如果您要查找完全匹配的內容,請不要忘記錨點^$ )。

您可以使用非捕獲組(?:...)和問號使這些組為可選:

[A-Z][a-z]+\s[A-Z][a-z]+(?:\s[A-Z][a-z]+(?:\s[0-9]{2,3})?)?

如果要提取數據,則使用命名捕獲是一種干凈的方法:

$pattern = <<<'LOD'
~
(?<first_name>[A-Z][a-z]+)
\s+
(?<last_name>[A-Z][a-z]+)
(?:
    \s+ (?<suffix>[A-Z][a-z]+)
    (?: \s+ (?<age> [0-9]{2,3}) )?
)?
~x
LOD;

preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER);

foreach ($matches as $match) {
    echo '<br/>' . $match['first_name'] . ', ' . $match['last_name'];
} 
([a-zA-Z]+\s+[a-zA-Z]+\s+[a-zA-Z0-9])

您可以使用http://www.cyber-reality.com/regexy.html之類的工具測試RegEx

暫無
暫無

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

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