@ 2021-12-16T21:29:02Z <?php
function parse(string $input): array
{
static $pattern = <<<'EOD'
/
# 先頭
^
# name 部分
(?<name>
# \p{L}\p{N} を最低1個は含む
(?=[^「」\p{C}\p{L}\p{N}]*+[\p{L}\p{N}])
# カッコと制御文字以外の繰り返し
[^「」\p{C}]++
)?
# カッコ+空白だけのコメントの場合は読み飛ばす条件分岐
(?:
# empty_comment 部分
(?<empty_comment>
「
# カッコの中身
(?:
# empty_comment の再帰
(?&empty_comment)
)*+
」
)
# empty_comment がマッチしたらそこまでをすべて読み飛ばす
(*SKIP)(*FAIL)
|
# comment 部分
(?<comment>
「
# カッコの中身
(?:
# \p{L}\p{N} を最低1個は含む
(?=[^「」\p{C}\p{L}\p{N}]*+[\p{L}\p{N}])
# カッコと制御文字以外の繰り返し
[^「」\p{C}]*+
# または
|
# comment の再帰
(?&comment)
)*+
」
)?
)
# 末尾
$
/ux
EOD;
preg_match($pattern, $input, $match);
$name = $match['name'] ?? '';
$comment = $match['comment'] ?? '';
// 外側のカッコを切り取り
$comment = mb_substr($comment, 1, -1, 'UTF-8');
$name = $name === '' ? null : $name;
$comment = $comment === '' ? null : $comment;
return compact('name', 'comment');
}
$inputs = [
/*
* 正しい値が与えられた場合、一方か両方に値が入る
*----------------------------------------------*/
'一郎「こんにちは」', // ["name"=>"一郎","comment"=>"こんにちは"]
'二郎「男の中の「男」です」', // ["name"=>"二郎","comment"=>"男の中の「男」です"]
'三郎', // ["name"=>"三郎","comment"=>"null"]
'「こんばんは」', // ["name"=>"null","comment"=>"こんばんは"]
/*
* 不正な値が与えられた場合、いずれも null を返す
*----------------------------------------------*/
//(1)以下のように「」の後に文字がある場合 null とする
'「こんばんは」です', // ["name"=>"null","comment"=>"null"]
//(2)以下のように「」がセットじゃない場合 null とする
'五郎「男の中の「男」かも', // ["name"=>"null","comment"=>"null"]
'「男の中の「男」かも', // 同上
'「やばい', // 同上
'ねむい」', // 同上
'「', // 同上
'」', // 同上
'「「」', // 同上
//(3)以下のように記号だけの場合 null とする
'「」', // ["name"=>"null","comment"=>"null"]
'「「」」', // 同上
'「★」', // 同上
'「!!」', // 同上
];
foreach ($inputs as $input) {
var_dump([$input => parse($input)]);
}
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).
Version System time (s) User time (s) Memory (MiB) 8.4.2 0.004 0.007 19.15 8.4.1 0.009 0.000 19.74 8.3.15 0.006 0.013 17.41 8.3.14 0.008 0.011 17.18 8.3.13 0.006 0.003 17.27 8.3.12 0.009 0.000 20.91 8.3.11 0.009 0.000 18.81 8.3.10 0.016 0.004 16.91 8.3.9 0.013 0.007 18.52 8.3.8 0.009 0.000 20.61 8.3.7 0.012 0.008 17.00 8.3.6 0.013 0.007 17.25 8.3.5 0.015 0.003 20.49 8.3.4 0.007 0.007 23.67 8.3.3 0.010 0.007 18.95 8.3.2 0.003 0.006 24.18 8.3.1 0.008 0.000 24.66 8.3.0 0.008 0.000 26.16 8.2.27 0.007 0.010 17.32 8.2.26 0.009 0.009 16.61 8.2.25 0.013 0.006 18.86 8.2.24 0.008 0.012 17.32 8.2.23 0.012 0.009 20.94 8.2.22 0.010 0.013 24.06 8.2.21 0.008 0.011 26.77 8.2.20 0.009 0.000 16.84 8.2.19 0.009 0.006 16.75 8.2.18 0.010 0.010 25.92 8.2.17 0.012 0.009 19.15 8.2.16 0.004 0.011 22.96 8.2.15 0.000 0.008 25.66 8.2.14 0.008 0.000 24.66 8.2.13 0.003 0.006 26.16 8.2.12 0.000 0.008 21.18 8.2.11 0.009 0.003 20.66 8.2.10 0.004 0.007 20.47 8.1.31 0.011 0.007 16.58 8.1.30 0.007 0.013 18.52 8.1.29 0.003 0.006 18.88 8.1.28 0.016 0.003 25.92 8.1.27 0.005 0.003 23.99 8.1.26 0.006 0.003 26.35 8.1.25 0.004 0.004 28.09 8.1.24 0.003 0.006 19.15 8.1.23 0.010 0.003 19.32 8.1.0 0.008 0.003 17.72
preferences:dark mode live preview
60.36 ms | 403 KiB | 5 Q