选择两个字符之间的所有内容,不包括它

时间:2013-09-22 15:53:20

标签: php regex

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

示例字符串:

@ Some text here @

要选择这个,我做了:

/@(.*)@/

但它包含@标志

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

2 个答案:

答案 0 :(得分:5)

听起来您不熟悉捕获群组的概念。从“这里的一些文字”中,您可以使用/t(.+)t/之类的内容在“文本”一词的中间提取“ex”。虽然整个比赛将是“文本”,但组#1将只是“前”。

您可以通过将空变量/空数组作为第三个参数传递给preg_match($pattern, $subject, $matches)来在PHP中使用捕获组。

  

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

答案 1 :(得分: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. 第二个表达式使用所谓的环视。这意味着第一个和最后一个括号的字符不是搜索区域的一部分,而是在之前/之后。