не соответствует строка в скобках PHP регулярное выражение

Я пытался использовать preg_replace () в php для замены строки. Я хочу сопоставить и заменить все ‘s’ в этой строке, но я только что пришел с решением, просто сопоставляя ‘s’ между ‘b’ и ‘c’ или ‘s’ между> <, Есть ли способ использовать отрицательный взгляд не только для символа ‘>’, но и для всей строки? Я не хочу ничего заменять в скобках.

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

редактировать:
просто получить ‘s’ в> s< и в BSC. Затем, когда я изменю строку, например, с ‘s’ на ‘te’, чтобы заменить ‘te’ в xtex и sometehing. Поэтому я искал регулярное выражение, чтобы избежать замены чего-либо в <….>

2

Решение

Вы можете использовать этот шаблон:

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

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

regex101 demo

Объяснение картины:

(               # 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

Последнее «с» не совпадает, поэтому не заменяется.

2

Другие решения

использование 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));
0

По вопросам рекламы [email protected]