我一直在尝试四处寻找如何选择字符串中两个字符之间的所有内容。
示例字符串:
@ Some text here @
为了选择这个,我做了:
/@(.*)@/
但它包括@
标志
我尝试使用我在网上找到的不同方法,但没有成功。
听起来您不熟悉捕获组的概念。从"此处的一些文本"中,您可以使用类似 /t(.+)t/
.虽然整个比赛将是"文本",但组 #1 将只是"ex"。
您可以在 PHP 中使用捕获组,方法是将空变量/空数组作为第三个参数传递给 preg_match($pattern, $subject, $matches)
。
如果提供了
$matches
,则填充搜索结果。$matches[0]
将包含与完整模式匹配的文本,$matches[1]
将具有与第一个捕获的文本匹配的文本 括号中的子模式,依此类推。
你在用什么方法?我将用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]
将始终为您提供正确的字符串(因为字符串所在的括号是可搜索区域中的第一个)。
至于表达方式:
第一个是普通版本。在指定字符中查找指定的文本(除 @ 之外的所有文本)。但是由于
preg_match_all
为您提供了它找到的整个字符串以及结果,因此您也会得到@。第二个表达式使用所谓的环顾四周。这意味着字符在第一个和最后一个括号中不是搜索区域的一部分,而是在搜索区域之前/后面。