1

我一直在尝试寻找如何选择字符串中两个字符之间的所有内容。

示例字符串:

@ Some text here @

要选择这个,我做了:

/@(.*)@/

但它包括@标志

我尝试使用我在网上找到的不同方法,但没有成功。

4

2 回答 2

5

听起来您对捕获组的概念不熟悉。从“Some text here”中,您可以使用类似/t(.+)t/. 虽然整个匹配将是“文本”,但组 #1 将只是“前”。

您可以通过将空变量/空数组作为第三个参数传递给preg_match($pattern, $subject, $matches).

如果$matches提供,则填充搜索结果。 $matches[0]将包含与完整模式匹配的 $matches[1]文本,将具有与第一个捕获的带括号的子模式匹配的文本,依此类推。

于 2013-09-22T15:58:31.910 回答
0

您正在使用什么方法?我将preg_match_all用来解释两种可能的正则表达式

$text = "hello @this is what i want@notthis!";

if (preg_match_all("/@([^@]*)@/", $text, $results))
    var_dump($results);
    // [0][0] "@this is what i want@"
    // [1][0] "this is what i want"

if (preg_match_all("/(?<=@)([^@]*)(?=@)/", $text, $results))
    var_dump($results);
    // [0][0] "this is what i want"
    // [1][0] "this is what i want"

如果出现多次,则可以循环遍历第一个深度。因此,循环$results[1]将始终为您提供正确的字符串(因为字符串所在的括号是可搜索区域中的第一个)。

至于表达式:

  1. 第一个是普通版。您在指定字符内查找指定文本(除@之外的所有内容)。但是因为preg_match_all给你它找到的整个字符串加上结果,你也会得到@。

  2. 第二个表达式使用所谓的环视。这意味着第一个和最后一个括号中的字符不是搜索区域的一部分,而是在之前/之后。

于 2013-09-22T16:07:40.240 回答