如何替换以“[id”开头,具有未知中间部分并以“]结尾”的字符串?

时间:2010-09-30 14:57:10

标签: php regex string replace

我想在$ text中替换以“[id”开头,中间部分未知并以“]结尾”的字符串。我知道如何替换以“[id”开头并以“]结尾”开头的字符串,但我无法弄清楚如何将未知的中间身体部分作为替换规则。

如何更换这样的想法?

感谢。

3 个答案:

答案 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 ]

概念:

  • Character classes - 字符类是一种描述角色可以是一系列可能性之一的方式。字符类以[开头,以]结尾。例如,[abc]匹配a b c。如果类中的第一个字符是^,则字符类可以否定[^abc]匹配不是 a的任何字符 b c。在我们的模式中,[^\]]匹配任何不是]的字符。请注意,类中的]必须转义,因为]通常表示类的结尾,但我们要指定文字]字符。<登记/>
  • Repetition使用* - 可以重复部分模式(允许模式指定某些内容可以多次出现)。有三个重复运算符:?指定某些东西可能出现零次或一次(即它构成了模式的一部分optional); *指定某些内容可能出现零次或多次(即,它可以是可选的,但也可以是任意次数); +指定必须至少出现一次的内容 在我们的情况下; [^\]]*指定不是]的字符可以匹配零次或多次 - 这将匹配空字符串,或匹配abcdefg,因为否定字符类匹配7次(因为每个角色都不是]) 请注意,默认情况下,正则表达式为greedy,这意味着它们将匹配尽可能多的字符串;因此[^\]]*abcdefg匹配时将匹配整个字符串,因为这是它可以进行的最大匹配(即使较小的子字符串与模式匹配)。

    < / LI>
  • 此模式中的其他所有内容都符合字面意思。如上所述,[]需要进行转义以匹配文字字符 - 因为它们在正则表达式中具有意义(即定义字符类) - 但id匹配一个i紧跟着d

当你把它们放在一起时,你最终会得到一个与左括号相匹配的图案,后跟字母id,后跟零个或多个字符,然后是一个右括号。

请注意,如果您希望此模式不区分大小写,则可以在最终斜杠后添加i/\[id[^\]]*\]/i/imodifier,它使整个模式不区分大小写(因此它也匹配[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;
?>