[英]Conditional regex in PHP doesn't seem to work
使用 preg 套件在 PHP 中執行正則表達式匹配,我知道您可以在正則表達式中表示條件語句。
我在網上幾乎找不到任何文檔,所以我求助於Jeffrey EF Friedl 的 Mastering Regular Expressions 。
我看到它的方式,像/(?(?<=NUM:)\\d+|\\w+)/
應該匹配一個數字,當它前面是NUM:
否則它應該匹配一個單詞。
但出於某種奇怪的原因,它總是返回 true 並且匹配數據對我來說也沒有意義。 有人可以向我解釋發生了什么嗎?
我想做的是這樣的:
preg_replace('/creat(?:e|ing)/i', 'make', $input)
but only when '/creat(?:e|ing)/i' is not surrounded by quotes.
實際上,我需要的輸入輸出序列是:
輸出:做一件白襯衫。
輸出: “創建一件白襯衫”
輸出:你好,編寫一些好的代碼。
輸出: “你好”“制作一些”好的“代碼”。
謝謝大家!
編輯:我想做一些類似的事情:如果有一個開場白,在這種情況下,在匹配關鍵字create
之前,確保它有一個結束對。 希望這是有道理的,也是可能的。
您不需要任何條件構造來跳過引號內的內容。 有兩種方法。
使用與帶引號的子字符串匹配的替代分支並使用(*SKIP)(*FAIL)
動詞:
preg_replace('/"[^"]*"(*SKIP)(*F)|creat(?:e|ing)/i', 'make', $input)
圖案詳情:
"[^"]*"
- 匹配"
,然后是除"
之外的 0+ 個字符,然后是"
(*SKIP)(*F)
- 使正則表達式引擎丟棄當前匹配的文本並從當前索引開始|
- 或者...creat(?:e|ing)
- 匹配create
或creating
。看演示
另一種方法是僅使用捕獲和使用preg_replace_callback
,您可以在其中檢查組是否匹配(並適當地建立替換邏輯):
preg_replace_callback('/("[^"]*")|creat(?:e|ing)/i', function($m) {
return !empty($m[1]) ? $m[1] : 'make';
}, $input)
圖案詳情:
("[^"]*")
- 第 1 組(稍后可以從替換模式中用$1
引用) - 雙引號字符串|
- 或者creat(?:e|ing)
- 匹配create
或creating
。 請注意, "[^"]*"
是一個示例正則表達式,如果您需要將 C 字符串與轉義序列匹配,則至少應使用"[^"\\\\\\\\]*(?:\\\\\\\\.[^"\\\\\\\\]*)*"
(在代碼中)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.