Я пытался использовать 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. Поэтому я искал регулярное выражение, чтобы избежать замены чего-либо в <….>
Вы можете использовать этот шаблон:
$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
Последнее «с» не совпадает, поэтому не заменяется.
использование 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));