簡體   English   中英

PHP 中的條件正則表達式似乎不起作用

[英]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.

實際上,我需要的輸入輸出序列是:

  1. 輸入:創建一件白襯衫。

輸出:做一件白襯衫。

  1. 輸入: “創建一件白襯衫。”

輸出: “創建一件白襯衫”

  1. 輸入:你好,創建一些好的代碼。

輸出:你好,編寫一些好的代碼。

  1. 輸入: “你好”“制作一些”好的“代碼”。

輸出: “你好”“制作一些”好的“代碼”。

謝謝大家!

編輯:我想做一些類似的事情:如果有一個開場白,在這種情況下,在匹配關鍵字create之前,確保它有一個結束對。 希望這是有道理的,也是可能的。

您不需要任何條件構造來跳過引號內的內容。 有兩種方法。

使用與帶引號的子字符串匹配的替代分支並使用(*SKIP)(*FAIL)動詞:

 preg_replace('/"[^"]*"(*SKIP)(*F)|creat(?:e|ing)/i', 'make', $input)

圖案詳情:

  • "[^"]*" - 匹配" ,然后是除"之外的 0+ 個字符,然后是"
  • (*SKIP)(*F) - 使正則表達式引擎丟棄當前匹配的文本並從當前索引開始
  • | - 或者...
  • creat(?:e|ing) - 匹配createcreating

演示

另一種方法是僅使用捕獲和使用preg_replace_callback ,您可以在其中檢查組是否匹配(並適當地建立替換邏輯):

 preg_replace_callback('/("[^"]*")|creat(?:e|ing)/i', function($m) {
     return !empty($m[1]) ? $m[1] : 'make';
 }, $input)

查看IDEONE 演示

圖案詳情

  • ("[^"]*") - 第 1 組(稍后可以從替換模式中用$1引用) - 雙引號字符串
  • | - 或者
  • creat(?:e|ing) - 匹配createcreating

請注意, "[^"]*"是一個示例正則表達式,如果您需要將 C 字符串與轉義序列匹配,則至少應使用"[^"\\\\\\\\]*(?:\\\\\\\\.[^"\\\\\\\\]*)*" (在代碼中)。

暫無
暫無

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

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