PHP preg_replace - 替换文本部分但不要太快
PHP preg_replace - Replace text part but not too soon
使用:
$text = preg_replace("/\[\[(.*?)SPACE(.*?)\]\]/im",'',$text);
清理并得到wordtwo
$text = '..text.. [[wordoneSPACE**wordtwo**]] ..moretext..';
但如果文本有 [[ before
则失败
$text = '.. [[ ..text(not to cut).. [[wordoneSPACE**wordtwo**]] ..moretext..';
我怎样才能限制到只有 SPACE 这个词的地方?
如果[[...]]
里面没有[
和]
可以用
$text = preg_replace("/\[\[([^][]*)SPACE([^][]*)]]/i",'',$text);
见regex demo。 [^][]
否定字符 class 将只匹配除 [
和 ]
之外的字符,并且不会跨越 [[...]]
边界。
否则,使用 :
$text = preg_replace("/\[\[((?:(?!\[{2}).)*?)SPACE(.*?)]]/is",'',$text);
参见 this regex demo。
(?:(?!\[{2}).)*?
模式将匹配任何字符,重复 0 次或多次但尽可能少,不会开始 [[
字符序列,并且不会跨越下一个实体 [[
边框。
另一个选项可能是使用 possessive quantifiers。
在第一组中,您可以使用否定字符 class 来匹配除方括号或 S 之外的任何字符(如果其后跟 SPACE。
\[\[([^][S]++(?:S(?!PACE)|[^][S]+)*+)SPACE([^][]++)\]\]
部分
\[\[
匹配 [[
(
捕获 组 1
[^][S]++
匹配除 S、] 或 [ 以外的任何字符 1 次以上
(?:
非捕获组
S(?!PACE)
匹配后面没有 PACE 的 S
|
或
[^][S]+
匹配除 S、] 或 [ 以外的任何字符 1 次以上
)*+
关闭群重复0+次
)
关闭组 1
SPACE
字面匹配
(
捕获 第 2 组
[^][]++
匹配除 ]
或 [
之外的任何字符 1+ 次
)
关闭群组
\]\]
匹配 ]]
使用:
$text = preg_replace("/\[\[(.*?)SPACE(.*?)\]\]/im",'',$text);
清理并得到wordtwo
$text = '..text.. [[wordoneSPACE**wordtwo**]] ..moretext..';
但如果文本有 [[ before
则失败$text = '.. [[ ..text(not to cut).. [[wordoneSPACE**wordtwo**]] ..moretext..';
我怎样才能限制到只有 SPACE 这个词的地方?
如果[[...]]
里面没有[
和]
可以用
$text = preg_replace("/\[\[([^][]*)SPACE([^][]*)]]/i",'',$text);
见regex demo。 [^][]
否定字符 class 将只匹配除 [
和 ]
之外的字符,并且不会跨越 [[...]]
边界。
否则,使用
$text = preg_replace("/\[\[((?:(?!\[{2}).)*?)SPACE(.*?)]]/is",'',$text);
参见 this regex demo。
(?:(?!\[{2}).)*?
模式将匹配任何字符,重复 0 次或多次但尽可能少,不会开始 [[
字符序列,并且不会跨越下一个实体 [[
边框。
另一个选项可能是使用 possessive quantifiers。
在第一组中,您可以使用否定字符 class 来匹配除方括号或 S 之外的任何字符(如果其后跟 SPACE。
\[\[([^][S]++(?:S(?!PACE)|[^][S]+)*+)SPACE([^][]++)\]\]
部分
\[\[
匹配[[
(
捕获 组 1[^][S]++
匹配除 S、] 或 [ 以外的任何字符 1 次以上
(?:
非捕获组S(?!PACE)
匹配后面没有 PACE 的 S
|
或[^][S]+
匹配除 S、] 或 [ 以外的任何字符 1 次以上
)*+
关闭群重复0+次
)
关闭组 1SPACE
字面匹配(
捕获 第 2 组[^][]++
匹配除]
或[
之外的任何字符 1+ 次
)
关闭群组\]\]
匹配]]