Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何正确地编写regexp?_Php_Regex - Fatal编程技术网

Php 如何正确地编写regexp?

Php 如何正确地编写regexp?,php,regex,Php,Regex,我应该如何定义要执行的正则表达式\。不转换为目录分隔符DS的序列是我的项目中目录分隔符的快捷方式?已更新,根据注释: $data = array( 'core.*', 'handlers.player.profile', 'vendor.dummy\.test' ); $re = '/(?!<\\\\)\./'; foreach ($data as $path) { $path = __DIR__ . DS . preg_replace($re, DS,

我应该如何定义要执行的正则表达式\。不转换为目录分隔符DS的序列是我的项目中目录分隔符的快捷方式?

已更新,根据注释:

$data = array(
    'core.*',
    'handlers.player.profile',
    'vendor.dummy\.test'
);

$re = '/(?!<\\\\)\./';

foreach ($data as $path) {
    $path = __DIR__ . DS . preg_replace($re, DS, $path) . '.php';
    echo "$path <BR>";
}

正如您所注意到的,PHP已经知道目录分隔符。重新定义已经存在的标识符不是一个好的做法,尤其是当唯一的原因是保护字符时。然而,这里应该发生什么?为什么不继续使用/,它了解每个操作系统?我知道每个操作系统都支持/,但PHP将文件/目录操作中的斜杠转换为操作系统样式。例如,如果我将使用fopen'./foo/bar.php','r';PHP解释器将在Windows上执行之前转换为\对我有效。。。我知道您希望任何`都替换为/`,但前提是前面不加反斜杠,后面不加点。这不对吗?把点转换成DS。若反斜杠在圆点之前,则圆点不应转换为DS。啊。。。我懂了。更新了答案。
php > var_dump(preg_replace('/(?<=[^\\\\])\./', DIRECTORY_SEPARATOR, 'vendor.dummy\.test'));
string(18) "vendor/dummy\.test"