簡體   English   中英

SKIP-FAIL正則表達式具有多種模式,可在一個PCRE正則表達式中忽略

[英]SKIP-FAIL regex with multiple patterns to ignore in one PCRE regex

我試圖將一個字符串替換為另一個字符串,但前提是該字符串必須用雙引號或單引號引起來。 我可以做雙打,但是也有單打的問題。

我將preg_repalce與array一起使用,因為我還有其他適用於字符串的規則。

$text = <<<DATA
I love php
"I love php"
'I love php'
"I" love 'php'
DATA;

$text = preg_replace(
    [
     '/"[^"]*"(*SKIP)(*FAIL)|\blove\b/i'
    ],
    [
     'hate'
    ],
    $text
);

echo $text;

輸出是

I hate php     -> OK
"I love php"   -> OK
'I hate php'   -> NOT OK
"I" hate 'php' -> OK

我的問題是單引號

或者,您也可以使用捕獲組來捕獲單引號或雙引號,並使用反向引用來匹配相同的引號:

$re = '/([\'"]).*?\1(*SKIP)(*F)|\blove\b/';

正則演示

PHP代碼:

$re = '/([\'"]).*?\1(*SKIP)(*F)|\blove\b/';
$text = preg_replace($re, 'hate', $text);

代碼演示

您需要對要跳過的分組進行分組 ,並使用單引號的字符串文字時對單引號進行轉義:

'/(?:\'[^\']*\'|"[^"]*")(*SKIP)(*FAIL)|\blove\b/i'
  ^^^          ^       ^

參見regex演示

現在, (*SKIP)(*FAIL)將適用於\\'[^\\']*\\'"[^"]*"

暫無
暫無

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

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