【问题标题】:How do I replace a string that starts with "[id", has an unknown middle part and ends in "]"?如何替换以“[id”开头、中间部分未知且以“]”结尾的字符串?
【发布时间】:2011-04-19 09:52:21
【问题描述】:

我想替换 $text 中以“[id”开头、中间部分未知且以“]”结尾的字符串。我知道如何替换以“[id”开头并以“]”结尾的字符串,但我不知道如何将未知的中间正文部分作为替换规则。

任何想法如何替换这样的?

谢谢。

【问题讨论】:

  • 我建议你使用正则表达式。使用此站点帮助您形成搜索模式:gskinner.com/RegExr
  • 如果'中间部分未知'包含']'字符怎么办?

标签: php regex string replace


【解决方案1】:

字符串替换函数只能对特定字符串起作用。如果你有想要匹配的pattern,你应该使用preg_replace,它基于正则表达式替换:

$text = preg_replace('/\[id[^\]]*\]/', $replacement, $text)
// $replacement is whatever string you want to replace with

/\[id[^\]]*\]/regular expression(又名 regex)。每端的斜线是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的字符em> b c。在我们的模式中,[^\]] 匹配任何不是] 的字符。请注意,类中的] 必须转义,因为] 通常表示类的结束,但我们想指定文字] 字符。

  • Repetition 使用 * - 部分模式可以重复(这允许模式指定某些内容可以多次出现)。有三个重复操作符:? 指定某些东西可能出现零次或一次(即它成为您的模式的一部分optional); * 指定某事可能出现零次或多次(即它可以是可选的,但也可以是任意次数); + 指定必须至少出现一次的内容。
    在我们的案例中; [^\]]* 指定非 ] 的字符可以匹配零次或多次 - 这将匹配一个空字符串,或者将匹配 abcdefg,因为否定字符类匹配 7 次(因为每个字符不是 @ 987654357@).
    请注意,默认情况下,正则表达式为greedy,这意味着它们将匹配尽可能多的字符串;因此,[^\]]*abcdefg 匹配时将匹配整个字符串,因为这是它可以进行的最大匹配(即使较小的子字符串与模式匹配)。

  • 此模式中的所有其他内容都按字面意思匹配。正如我们在上面看到的,[] 需要转义以匹配文字字符 - 因为它们在正则表达式中具有含义(即定义字符类) - 但 id 匹配紧随其后的 i通过d

当你把所有这些放在一起时,你最终会得到一个匹配左括号的模式,然后是字母 id,然后是零个或多个字符,然后是右括号。

请注意,如果您想让此模式不区分大小写,您可以在最后一个斜杠后添加 i/\[id[^\]]*\]/i/imodifier,它使整个模式不区分大小写(因此它也匹配 [ID=...])。

如果您不熟悉正则表达式,我建议您通读正则表达式.info 上的tutorial,因为它会让您很好地了解它们的作用以及如何编写它们。

【讨论】:

    【解决方案2】:

    使用preg_replace():

    <?php
    
        $text = "[hi=hello] [id=hellomynameisjoe] [hello=hi]";
        $new = preg_replace('@\[id[^\]]+\]@', '[replaced!]', $text);
        echo $new;
    ?>
    

    【讨论】:

    【解决方案3】:

    以下内容将删除所有出现的[idsomething]something 将匹配除] 之外的所有字符。

    $newText = preg_replace('#\[id[^\]]+\]#', '', $subject);
    

    如果你知道 something 总是一个数字,你可以使用这样的东西:

    $newText = preg_replace('#\[id\d+\]#', '', $subject);
    

    有关正则表达式的更多信息,请参阅此网站:http://www.regular-expressions.info/

    【讨论】:

      猜你喜欢
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多