Php Regex@symbol及其使用方法';过去的

Php Regex@symbol及其使用方法';过去的,php,regex,Php,Regex,如果有人在某个地方回答了这个问题,我很抱歉我找不到。这是来自preg_match的php参考 <?php // get host name from URL preg_match('@^(?:http://)?([^/]+)@i', "http://www.php.net/index.html", $matches); $host = $matches[1]; // get last two segments of host name preg_match('/[^.]+\.[^.]+$

如果有人在某个地方回答了这个问题,我很抱歉我找不到。这是来自preg_match的php参考

<?php
// get host name from URL
preg_match('@^(?:http://)?([^/]+)@i',
"http://www.php.net/index.html", $matches);
$host = $matches[1];

// get last two segments of host name
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
echo "domain name is: {$matches[0]}\n";
?>

除了@^和@我之外,我了解所有这些。我已经搜索了大量的正则表达式引用,除了作为分隔符之外,没有看到任何关于@符号的提及,这里的情况并非如此

谢谢

@
是这里的分隔符。第一个
@
后面的
^
表示匹配应该从字符串的开头开始,后面的
i
是一个开关,表示正则表达式不区分大小写

任何非字母数字字符都可以用作分隔符。作者之所以选择
@
分隔符而不是更标准的
/
,是为了不必转义正则表达式中的斜杠


您的正则表达式等价于以下内容:

'/^(?:http:\/\/)?([^\/]+)/i'

@
作为分隔符在这里就是这样。
@^
@i
没有什么特别之处。符号
@
^
i
都是分开的,表示:

  • 正则表达式分隔符(可以是任何其他非字母数字字符或
    {}
    的组合)
  • 起跑线
  • 不区分大小写的修饰语

  • 正在使用
    @
    代替更常见的
    /
    ,因为在模式中使用了
    /
    。它只允许模式更具可读性,而无需转义

    想象一下(相同的模式):


    正如其他人所提到的,
    i
    ,使得模式CasE没有意义。

    谢谢,这很有意义。感谢快速的回答。
    @^(?:http://)?([^/]+)@i
    /^(?:http:\/\/)?(^\/]+)/i