了解regex / preg_replace

时间:2013-03-23 15:12:12

标签: php regex

我正在使用一些正则表达式(有效),但实际上并不了解它正在做什么。作为一名科学家,我喜欢关注我所做的一切!

代码来自此SO答案:https://stackoverflow.com/a/118886/889604

$mtime = filemtime($_SERVER['DOCUMENT_ROOT'] . $file);
return preg_replace('{\\.([^./]+)$}', ".$mtime.\$1", $file);

此代码采用文件名(例如/files/style.css),并添加文件mtime(例如/files/styles.1256788634.css)。

所以,我得到^$符号是要匹配的字符串的开头和结尾,并且./匹配任何字符的任意次数(因为+),但mtime如何在文件名和扩展名之间结束?

3 个答案:

答案 0 :(得分:1)

{}用作分隔符,不参与搜索模式。 \\.描述了一个点。点必须被转义(因此是反斜杠),因为未转义的点将描述任何单个字符的存在。圆括号( ... )定义了一个可以通过第$1个参数中的preg_replace访问的组。该组的内容由[^./]+组成,表示

  

正数量(通过集合后的+定义)任何单个字符不是(集合开头的^表示not)点{{1 }或斜杠.

圆括号后跟一个/,它描述了该行的结尾。

表达式将匹配路径的文件扩展名,例如$,而.css将是组css的值。因此,$1将替换为.css,其中.$mtime.css将是php变量的值。

答案 1 :(得分:0)

由于PHP的字符串插值规则,mtime在输出中结束,导致在双引号字符串内引用的变量输出变量的值而不是变量名的文字文本。有关详细信息,请参阅http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.double(部分的最后一句)。

答案 2 :(得分:0)

所有正则表达式模式正在使用括号.css替换整个文件扩展名css并将没有句点([^./]+)的扩展名存储到捕获中。然后,它会将.css中的扩展名$file替换为句点,$mtime的值,另一个句点以及正则表达式$1中捕获的扩展名。

并注意:^并不意味着字符串的开头。当它在像[^./]这样的组中时,它会说“匹配任何字符,除了这些字符”

我希望所有这些都有意义。

编辑:它只匹配$ file的.css部分,因为\\.告诉正则表达式在$ file中找到的第一个句点开始,然后继续进行捕获。它必须使用\\.进行转义,因为它会像正则表达式一样匹配任何字符。