我愿意包含更多的代碼,而不僅僅是正則運算式。
我正在撰寫一些代碼來拍照,運行幾個 Imagick 過濾器,然后tesseractOCR通過,以輸出文本。
從該文本中,我使用正則運算式和 PHP 來提取SKU(產品型號)并將結果輸出到陣列中,然后將其插入到表中。
一切都很好,除了我現在使用的表達方式:
\w[^az\s\/?!@#-$%^&*():;.,–∑′??¥¨??π?????˙Δ??Ω≈?√∫~μ≤≥] {4,20}
我仍然會取回一些只包含字母的字串。
最終目標:
可能包含大寫字母和數字,-strings
只包含數字-strings,
不僅包含字母-strings,
不包含任何小寫字母-strings,
-這些字串必須是4-20個字符之間
舉個例子:
aSKU可能是5209,也可能是WRE5472UFG5621。
uj5u.com熱心網友回復:
在正則運算式大師出現之前,像我這樣的懶人只會在這上面做兩輪并保持簡單。首先,匹配所有只有A-Z, 的字串0-9(而不是制作大量的無串列或外觀)。然后,preg_grep()與PREG_GREP_INVERT標志一起使用以洗掉所有僅 AZ 的字串。最后,過濾獨特的匹配以消除重復噪聲。
$str = '-9 Cycles 3 Temperature Levels Steam Sanitizet -Sensor Dry | ALSO AVAILABLE (PRICES MAY VARY) |- White - 1258843 - DVE45R6100W { Platinum - 1501 525 - DVE45R6100P desirable: 1258843 DVE45R6100W';
$wanted = [];
// First round: Get all A-Z, 0-9 substrings (if any)
if(preg_match_all('~\b[A-Z0-9]{6,24}\b~', $str, $matches)) {
// Second round: Filter all that are A-Z only
$wanted = preg_grep('~^[A-Z] $~', $matches[0], PREG_GREP_INVERT);
// And remove duplicates:
$wanted = array_unique($wanted);
}
結果:
array(3) {
[2] · string(7) "1258843"
[3] · string(11) "DVE45R6100W"
[4] · string(11) "DVE45R6100P"
}
請注意,{6,24}即使您說的是 4 字符匹配,我也已將匹配長度增加,因為您的示例字串有 4 位數的子字串不在您的“理想”串列中。
編輯:我已將其移動preg_match_all()到包含剩余操作的條件構造中,并$wanted默認設定為空陣列。您可以方便地捕獲匹配項并一次性評估是否匹配(而不是例如 have if(!empty($matches)))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/409282.html
標籤:
