簡體   English   中英

不匹配括號中的字符串php正則表達式

[英]don't match string in brackets php regex

我一直在嘗試在 php 中使用 preg_replace() 來替換字符串。 我想匹配並替換此字符串中的所有 's',但我只是提供了解決方案,僅在 'b' 和 'c' 之間使用了 's' 或 > < 之間的 's'。 有什么方法可以讓我不僅對字符 '>' 而是對整個字符串使用負向外觀嗎? 我不想替換括號中的任何內容。

     <text size:3>s<text size:3>absc
     <text size:3>xxetxx<text size:3>sometehing

編輯:只需在 >s< 和 bsc 中獲取 's'。 然后,當我將字符串例如從“s”更改為“te”時,以替換 xtex 中的“te”和一些東西。 所以我正在尋找正則表達式以避免替換 <....> 中的任何內容

您可以使用此模式:

$pattern = '/((<[^>]*>)*)([^s]*)s/';
$replace = '\1\3■';                                      # ■ = your replacement string

$result = preg_replace( $pattern, $replace, $str );

regex101 演示

圖案說明:

(               # group 1:
(<[^>]*>)*      # group 2: zero-or-more <...>
)    
([^s]*)         # group 3: zero-or-more not “s”
s               # litterally “s”

如果您希望匹配不區分大小寫,請在模式末尾添加“i”:

$pattern = '/((<[^>]*>)*)([^s]*)s/i';

編輯:替換說明

在搜索模式中,我們有 3 個用圓括號括起來的組。 在替換字符串中,我們可以通過語法\\1來引用組,其中1是組號。

因此,示例中的替換字符串表示:將組 1 替換為自身,將組 3 替換為自身,將“s”替換為所需的替換。 我們不需要使用組 2,因為它包含在組 1 中(這是由於正則表達式無法檢索重復組)。

在演示字符串中:

abs<text size:3>ssss<text size:3><img src="img"><text size:3>absc
└┘╵└───────────┘╵╵╵╵└───────────────────────────────────────┘└┘╵╵
└─┘└────────────┘╵╵╵└──────────────────────────────────────────┘
 1  2            345 6

模式匹配:

     group 1    group 3       s
    ---------  ---------  ---------
1 >     0          1          1
2 >     1          0          1
3 >     0          0          1
4 >     0          0          1
5 >     0          0          1    
6 >     3          1          1

最后一個“c”不匹配,因此不會被替換。

使用preg_match_all獲取所有s字母並將其與標志PREG_OFFSET_CAPTURE一起使用以獲取索引。

正則表達式$pat包含否定的前瞻和后視,因此括號表達式中的s不匹配。

在本例中,我將s替換為字符串5 更改為要替換的字符串:

<?php

$s = " <text size:3>s<text size:3>absc";
$pat = "/(?<!\<text )s(?!ize:3\>)/";

preg_match_all($pat, $s, $matches, PREG_OFFSET_CAPTURE);

foreach ($matches[0] as $match) {
    $s[$match[1]] = "5";
}

print_r(htmlspecialchars($s));

暫無
暫無

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

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