我想在$ text中替换以“[id”开头,中间部分未知并以“]结尾”的字符串。我知道如何替换以“[id”开头并以“]结尾”开头的字符串,但我无法弄清楚如何将未知的中间身体部分作为替换规则。
如何更换这样的想法?
感谢。
答案 0 :(得分:5)
以下内容将删除[id
某些内容 ]
的所有内容。 某些内容将匹配除]
以外的所有字符。
$newText = preg_replace('#\[id[^\]]+\]#', '', $subject);
如果您知道某事始终是一个数字,您可以使用以下内容:
$newText = preg_replace('#\[id\d+\]#', '', $subject);
有关正则表达式的详细信息,请访问以下网站:http://www.regular-expressions.info/。
答案 1 :(得分:4)
字符串替换函数只能用于特定的字符串。如果您想要匹配模式,则应使用preg_replace
,它将替换为正则表达式:
$text = preg_replace('/\[id[^\]]*\]/', $replacement, $text)
// $replacement is whatever string you want to replace with
/\[id[^\]]*\]/
是regular expression(又名正则表达式)。每一端的斜杠都是delimiters,PHP需要这些斜杠来描述正则表达式。其余的模式可以描述如下:
\[ # match a literal [ character
id # match the string "id"
[^ # open a negated character class
\] # match anything other than literal ] character (since it's in a negated class)
]* # close the class, repeat it zero or more times
\] # match a literal ]
概念:
[
开头,以]
结尾。例如,[abc]
匹配a
或 b
或 c
。如果类中的第一个字符是^
,则字符类可以否定:[^abc]
匹配不是 a
的任何字符或 b
或 c
。在我们的模式中,[^\]]
匹配任何不是]
的字符。请注意,类中的]
必须转义,因为]
通常表示类的结尾,但我们要指定文字]
字符。<登记/> *
- 可以重复部分模式(允许模式指定某些内容可以多次出现)。有三个重复运算符:?
指定某些东西可能出现零次或一次(即它构成了模式的一部分optional); *
指定某些内容可能出现零次或多次(即,它可以是可选的,但也可以是任意次数); +
指定必须至少出现一次的内容
在我们的情况下; [^\]]*
指定不是]
的字符可以匹配零次或多次 - 这将匹配空字符串,或匹配abcdefg
,因为否定字符类匹配7次(因为每个角色都不是]
)
请注意,默认情况下,正则表达式为greedy,这意味着它们将匹配尽可能多的字符串;因此[^\]]*
与abcdefg
匹配时将匹配整个字符串,因为这是它可以进行的最大匹配(即使较小的子字符串与模式匹配)。[
和]
需要进行转义以匹配文字字符 - 因为它们在正则表达式中具有意义(即定义字符类) - 但id
匹配一个i
紧跟着d
。当你把它们放在一起时,你最终会得到一个与左括号相匹配的图案,后跟字母id
,后跟零个或多个字符,然后是一个右括号。
请注意,如果您希望此模式不区分大小写,则可以在最终斜杠后添加i
:/\[id[^\]]*\]/i
。 /i
是modifier,它使整个模式不区分大小写(因此它也匹配[ID=...]
)。
如果您不熟悉正则表达式,我建议您阅读regular-expressions.info上的tutorial,因为它会让您非常了解他们的工作以及如何撰写它们。
答案 2 :(得分:2)
使用preg_replace()
:
<?php
$text = "[hi=hello] [id=hellomynameisjoe] [hello=hi]";
$new = preg_replace('@\[id[^\]]+\]@', '[replaced!]', $text);
echo $new;
?>