[英]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 );
圖案說明:
( # 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.