2

如果在某个地方回答了这个问题,我很抱歉我找不到它。这取自 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 之外的所有这些。我已经搜索了大量的正则表达式参考,除了作为分隔符之外,没有看到任何提及 @ 符号的内容,这里不是这种情况。

谢谢

4

3 回答 3

5

@被用于代替更常见的/因为/在模式中使用。它只是让模式更具可读性,而不必转义它。

如下图(相同模式):

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

并且i,正如其他人所提到的,使模式 CasE InsEnSative。

于 2013-01-29T01:43:08.573 回答
3

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

任何非字母数字字符都可以用作分隔符。作者选择@分隔符而不是更标准的原因/是为了避免正则表达式中的斜线被转义。


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

'/^(?:http:\/\/)?([^\/]+)/i'
于 2013-01-29T01:41:36.773 回答
1

@定界符就是这里的情况。@^或没有什么特别之处@i。符号@^i都是独立的,表示:

  1. 正则表达式分隔符(可以是任何其他非字母数字字符或 的组合{}
  2. 线的开始
  3. 不区分大小写的修饰符
于 2013-01-29T01:42:59.977 回答