使用php找到两个字符串之间映射的字符串

时间:2014-05-09 23:23:09

标签: php string

我知道这个问题之前曾被多次询问并且被大部分读过,但我仍然对此有疑问。

我会有一个用[[[]]]映射的字符串,而且我不知道这个字符串的位置,要么我不知道这会有多少次发生。

例如:

$string = '[[[this is a string]]] and this is some other part. [[[this is another]]]and etc.';

现在,有人会帮助我了解如何找到this is a stringthis is another

Thanks in Advance

2 个答案:

答案 0 :(得分:2)

您需要使用preg_match_all(),并且还需要确保转义方括号,因为它们是特殊字符。

$string = '[[[this is a string]]] and this is some other part. [[[this is another]]]and etc.';
preg_match_all('/\[\[\[([^\]]*)\]\]\]/', $string, $matches);
print_r($matches);

正则表达式逻辑:

\[\[\[([^\]]*)\]\]\]

Regular expression visualization

Debuggex Demo

输出:

Array
(
    [0] => Array
        (
            [0] => [[[this is a string]]]
            [1] => [[[this is another]]]
        )

    [1] => Array
        (
            [0] => this is a string
            [1] => this is another
        )

)

答案 1 :(得分:1)

这是一个使用lookbehinds和lookaheads的方法:

$string = '[[[this is a string]]] and this is some other part. [[[this is another]]]and etc.';
preg_match_all('/(?<=\[{3}).*?(?=\]{3})/', $string, $m);

print_r($m);

这输出以下内容:

Array
(
    [0] => Array
        (
            [0] => this is a string
            [1] => this is another
        )

)

以下是REGEX的解释:

(?<=    \[{3}    )    .*?    (?=    \]{3}    )
  1       2      3     4      5       6      7
  1. (?<=正面看待 - (?<= ... )的这种组合告诉REGEX确保括号内的任何内容必须直接出现在我们想要匹配的任何内容之前。它将检查它是否在那里,但不会在比赛中包含它。
  2. \[{3}这就是要连续三次{3}寻找开口方括号'['。唯一的一点是方括号是REGEX中的一个特殊字符,所以我们必须用反斜杠\来转义它。 [变为\[
  3. )关闭后缀(项目#1)的结束括号)
  4. .*?这会告诉REGEX匹配任何字符.,任意次*,直到它碰到正则表达式?的下一部分。在这种情况下,它将击中的下一个部分将是三个结束方括号的前瞻。
  5. (?=积极前瞻 - (?= ... )的组合告诉REGEX确保括号中的任何内容必须直接位于我们当前匹配的前方(前方)。它将检查它是否存在,但不会将其作为我们比赛的一部分。
  6. \]{3}这会连续三次]查找结束方括号{3},与第2项一样,必须使用反斜杠\进行转义。
  7. )前瞻的括号)(第5项)